New CRT shader from Guest + CRT Guest Advanced updates

well, yes but not 100% different https://youtu.be/YLmv-QL_hG4?t=64

true but in modern screens we got something similar (or worst) which is motion blur :slight_smile: also the after glow pass will help

dont get me wrong, your design for implementing interlaced is nice, and does not blindly imitate interlaced in TV, but still it’s nice to have an option to blindly imitate interlaced in TV, Especially in some presets that has very bright 240p settings (Especially with settings that almost kill the scanlines in bright areas), and as I said interlaced mode=1 is so close to what I want but many settings wont affect in it (Especially settings in ā€œscanline optionsā€)

2 Likes

Hmm…well…i guess this would bring some extra work and tweaking.

Edit: i guess i have it running, too bad there are more guest-advanced versions = more work… :grin:

2 Likes

New Release Version (2025-10-02-r1):

Notable changes:

  • New interlace modes added to standard, ntsc and HD versions.
  • They use odd/even field shifted regular scanlines instead of odd/even linear scanlines.
  • Update: new interlace mode added to fast version.

Download link:

https://mega.nz/file/40BnwCrR#goT63gHGNE1q0IcvOgaCqueYr3Y3Y2Kv_NmlkD-VmrI

9 Likes

thanks! I did a test and seems work fine!

what about fast and fastest? I plan to use them, I did test fastest in 2016 mid/low end mobile and seems work even with ntsc adaptive!

also, is it possible to has an option to make ā€œRolling Scanlinesā€ work only with interlace mode 6 and only with 480?

I guess many feature tweaks are possible, but not this plausible.

I did a test with reinterlacing.slangp then append crt-guest-advanced.slangp

shaders = "13"
feedback_pass = "0"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/deinterlacing/shaders/reinterlacing.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias2 = "StockPass"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/guest/advanced/afterglow0.slang"
alias3 = "AfterglowPass"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "false"
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/guest/advanced/pre-shaders-afterglow.slang"
alias4 = "PrePass"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
filter_linear4 = "false"
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/advanced/avg-lum.slang"
alias5 = "AvgLumPass"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "true"
filter_linear5 = "true"
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/linearize.slang"
alias6 = "LinearizePass"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "true"
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
alias7 = ""
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "true"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "800"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias8 = "GlowPass"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "true"
float_framebuffer8 = "true"
srgb_framebuffer8 = "false"
scale_type_x8 = "absolute"
scale_x8 = "800"
scale_type_y8 = "absolute"
scale_y8 = "600"
shader9 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
alias9 = ""
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
filter_linear9 = "true"
float_framebuffer9 = "true"
srgb_framebuffer9 = "false"
scale_type_x9 = "absolute"
scale_x9 = "800"
scale_type_y9 = "absolute"
scale_y9 = "600"
shader10 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
alias10 = "BloomPass"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
filter_linear10 = "true"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced.slang"
alias11 = ""
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
filter_linear11 = "true"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "viewport"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
alias12 = ""
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
filter_linear12 = "true"
float_framebuffer12 = "false"
srgb_framebuffer12 = "false"
scale_type_x12 = "viewport"
scale_x12 = "1.000000"
scale_type_y12 = "viewport"
scale_y12 = "1.000000"
interm = "6.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_mipmap = "false"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_mipmap = "false"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_mipmap = "false"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_mipmap = "false"
SamplerLUT4_wrap_mode = "clamp_to_border"

there is indeed a phosphor persistance magic! I cant show you since it’s interlaced, you can try it and see

but not always work, here a test with just reinterlacing and afterglow

shaders = "5"
feedback_pass = "0"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/deinterlacing/shaders/reinterlacing.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias2 = "StockPass"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/guest/advanced/afterglow0.slang"
alias3 = "AfterglowPass"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "false"
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/guest/advanced/pre-shaders-afterglow.slang"
alias4 = "PrePass"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
filter_linear4 = "false"
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_mipmap = "false"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_mipmap = "false"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_mipmap = "false"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_mipmap = "false"
SamplerLUT4_wrap_mode = "clamp_to_border"

with ā€œAfterglow Strengthā€ = 0.00

with ā€œAfterglow Strengthā€ = 0.60

it should fill the gaps but it seems it only fill the edge

and with reinterlacing this problem will be worst!

2 Likes

I’ve been getting some GREAT results by stacking NTSC colors + GTUv50 + guest-advanced-NTSC.

Unfortunately, it makes my GPU explode - and it’s no slouch (3090 Ti). Games run fine, but it gets the fans spinning full speed. When I try to edit parameters it drops to like 5 fps or something while in the RA menu.

Would there be any significant performance benefit gained by stripping out all the glow and bloom effects and screen options? This is something I’d attempt on my own, just wondering if it would be worth it.

EDIT: nevermind, figured it out, carry on…

2 Likes

that because GTUv50 use viewport (your screen size), maybe NTSC colors is doing this too

3 Likes

I solved the problem:

Pause Content When Menu is Active OFF
Pause Content When Not Active OFF
2 Likes

You can also try using the new speedup option with ntsc shaders. When set to 2x, it approximatelly reduces the ntsc pass 1 output resolution from like 12k to 6k, which is more than enough.

Other, imo better option, is to play with gtu’s viewport horizontal multiplier, 0.5 should be enough for speeding up gtu + ntsc shaders. Bloom + glow pass scale to 800x600 absolute resolutions, it’s not a big deal for performance.

2 Likes

What is the source for the NTSC colors LUT?

2 Likes

It’s the 2nd,1953 NTSC standard .icc profile. All colometry changes must be relative to another profile. This one is relative to sRGB, so it’s getting best results if your moder display is tweaked close to sRGB. I made the LUT myself, using some software, which uses .icc profiles for colometry LUT pngs.

2 Likes

ā€œGuess what (or better - how) I’m drawin now:ā€ :grin: (don’t mind the non-sfx arangement)

4 Likes

Highly tasteful. Always good seeing something for the 480i/p content. Great work.

1 Like

New Release Version (2025-10-11-r1):

Notable changes:

  • crt-guest-advanced-pal preset added
  • update: some small tweaks (pal)
  • update: merge fields implemented (pal)
  • update: phase fileds improvements (pal)
  • update: pal phosphors enabled, interlacing enabled (pal preset)
  • update: hires mode default support, nice changes, cleanup (pal)
  • update: QoL changes, better filtering (pal)

Download link:

https://mega.nz/file/kppQEBKb#SCBWECbK8J4iK9wNJUDCoeSdnjZwAcW_RiFu8vqWCoQ

17 Likes

thanks! finally PAL get some love! I did some tests since the 1st update, its even nicer with the new silent updates!

BTW, how hard to make a shader that switch between PAL and NTSC based on the game? I remember some old TVs switch based on the FPS (hz) which will fail in case of PAL-60 (black and white image since it treated as NTSC), newer one get smart and will know if that is a PAL-60

also, I feel like crt-guest-advanced-pal treats everything as it is Normal 50hz PAL, which is what I saw in Famicom/Nes and mega drive/genesis but not the PS1 or PS2 which was PAL-60 most of the time

2 Likes

Thaks, @Jobima for replying. Yeah, it’s being polished atm., currently i’m quite content with the pal shaders added.

Double the shader instructions, double the fun! :wink: I guess it will stay separate for performance reasons and for better clarity. Most probably a ā€œDenial Of Serviceā€ won’t be implemented either if ā€œwrong region contentā€ is selected with the shader. :grin:

It’s a decent concern i guess, but the pal shaders can more or less be the same, the only thing that changes and needs to be addressed by the shaders is like a very minor drop in YUV bandwidth.

2 Likes

maybe also the speed of dot crawl and rainbow and others

1 Like

With PAL-60, by some info, you can set the phase to 1.0 or anything that works for you. The 60Hz implementation isn’t as formalized as normal PAL standards, so there were deviations. The phase timings were broken, so best you use a 1-phase setup with ā€œstatic diagonal effectsā€ for such content.

Or not…shaders can handle the 50Hz vs 60Hz speedup quite well. Generally i’m not adding a frame-skip or something, because it would break the phase flow.

1 Like

New Release Version (2025-10-12-r1):

Notable changes:

  • been improving the pal shaders recently, many nice changes
  • better chroma and luma filtering
  • added s-video and rgb-scart modes
  • note: p-uae hires+single line mode is supported out-of-the box
  • ofc. the pal experience is greatly modifiable with relevant parameters
  • update: functionality update
  • update: think it’s out of ā€œbetaā€ now :smiley:

Download link:

https://mega.nz/file/FooSHZYK#Al0TyaazhytYDuF_ZLsBkW3iVIq64VO5VsdpqOKx_fk

16 Likes