New CRT shader from Guest + CRT Guest Advanced updates

Hey sure! :smiley:

Open your RetroArch folder, then the shaders folder.

Inside, create a text document and copy the preset I posted earlier.

Then rename this text document to “test.slangp” without the quotes.

3 Likes

Thanks, I will try to do replicate that when I’m off from work. I’m trying to get better at that so I can take down y’all’s values.

2 Likes

I guess it’s been a while and the last guest-advanced version is doing well without some issues.

Would like to ask @hunterk politely if he would merge the last version into the slang repository.

The download link:

https://mega.nz/file/QoI0wAoS#z53_-BJN5hw9QieusZzhjDAbeuYJqL4gCvBfsfnpFv4

As usual, it’s just copy-paste, no deprecated files etc…

Thanks!

7 Likes

sounds good, thanks for the heads-up.

I have the PR prepared here: https://github.com/libretro/slang-shaders/pull/880

Let me know if that looks good and I’ll merge it.

4 Likes

Thanks again. It looks fine, can be merged. Regards!

4 Likes

How do would you guys expect the new QD-OLED V-Stripe sub-pixel layout to display masks intended for the standard LCD RBG layout?

3 Likes

Miniled is turning to be better for this OLED is giving headaches over burnouts last i heard

2 Likes

is there a version for glsl, I want to try this in nintendo switch’s retroarch

1 Like

Hi everyone! I’m sharing my custom preset for Mega Drive / Genesis and Sega CD based on crt-guest-advanced-pal.

The Goal: I wanted to achieve those specific authentic PAL colors.

Why no CRT Mask? A peak brightness of 300 nits and 1080 is not enough to use a proper CRT mask without making the image too dim and muddy.

Instead of heavy CRT (which often cause moiré or look too dark on 1080p), I focused on pure color accuracy and phosphor-like glow . The main goal was to achieve the “true” blue — no more eggplant Sonic!

Transparency and Anti-aliasing: Since I’m not using a mask, I relied on other techniques to handle pixel smoothing and transparency effects (like waterfalls and shadows). By balancing Bloom, Halation, and specific PAL-pass filtering , I achieved natural blending and “melted” pixels without the loss of brightness that comes with a traditional CRT grid.

Uses pal-pass logic to get vivid PAL colors even on NTSC regions.

HDR Glow: Tuned for 1080p HDR10 (300 nits) . It uses Bloom and Halation to simulate the light energy of a real CRT without the intrusive scanlines. High contrast (5.0) and brightness boost to make the image “pop” like a high-end consumer TV.

Best(?) with PAL PAR, but versatile.

Important Setup Notes:

  • HDR Requirements: HDR must be enabled in both Windows settings and RetroArch video settings.
  • Update Shaders: Make sure to update your slang shaders in RetroArch (Online Updater -> Update Slang Shaders) to ensure all paths and files are up to date.
  • SDR Warning: In SDR mode, the image will be over-saturated and too bright. This is a dedicated HDR10 preset.

Note on Image Clarity: Screenshots look a bit blurry in static, but it’s much sharper and clearer in motion on a real screen.

shaders = "19"
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/crt/shaders/guest/advanced/stock.slang"
alias1 = "StockPass"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "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/afterglow0.slang"
alias2 = "AfterglowPass"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "true"
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/pre-shaders-afterglow.slang"
alias3 = "PrePass0"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "true"
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/interlace-ntsc.slang"
alias4 = "InterlacePass"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "true"
float_framebuffer4 = "true"
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/pal/pal-pass1.slang"
alias5 = "PalPass1"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
filter_linear5 = "false"
float_framebuffer5 = "true"
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/pal/pal-pass2.slang"
alias6 = "PalPass2"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "false"
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "4.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/pal/pal-pass3.slang"
alias7 = "PalPass3"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "true"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "0.500000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/advanced/custom-fast-sharpen-pal.slang"
alias8 = "NtscPass"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "true"
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias9 = "PrePass"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
filter_linear9 = "true"
float_framebuffer9 = "false"
srgb_framebuffer9 = "false"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "source"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/guest/advanced/avg-lum-ntsc.slang"
alias10 = "AvgLumPass"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "true"
filter_linear10 = "true"
float_framebuffer10 = "false"
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/linearize-ntsc-new.slang"
alias11 = "LinearizePass"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
filter_linear11 = "true"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "source"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass1.slang"
alias12 = "Pass1"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
filter_linear12 = "true"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "viewport"
scale_x12 = "1.000000"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/hd/gaussian_horizontal.slang"
alias13 = ""
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
filter_linear13 = "true"
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "800"
scale_type_y13 = "source"
scale_y13 = "1.000000"
shader14 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias14 = "GlowPass"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
filter_linear14 = "true"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "800"
scale_type_y14 = "absolute"
scale_y14 = "600"
shader15 = "shaders_slang/crt/shaders/guest/hd/bloom_horizontal.slang"
alias15 = ""
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
filter_linear15 = "true"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "absolute"
scale_x15 = "800"
scale_type_y15 = "absolute"
scale_y15 = "600"
shader16 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
alias16 = "BloomPass"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
filter_linear16 = "true"
float_framebuffer16 = "true"
srgb_framebuffer16 = "false"
scale_type_x16 = "absolute"
scale_x16 = "800"
scale_type_y16 = "absolute"
scale_y16 = "600"
shader17 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass2.slang"
alias17 = ""
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
filter_linear17 = "true"
float_framebuffer17 = "true"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
shader18 = "shaders_slang/crt/shaders/guest/advanced/deconvergence-ntsc.slang"
alias18 = ""
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
filter_linear18 = "true"
float_framebuffer18 = "false"
srgb_framebuffer18 = "false"
scale_type_x18 = "viewport"
scale_x18 = "1.000000"
scale_type_y18 = "viewport"
scale_y18 = "1.000000"
PR = "0.000000"
PG = "0.000000"
PB = "0.000000"
AS = "0.000000"
agsat = "0.000000"
CP = "1.000000"
TNTC = "1.000000"
WP = "-10.000000"
wp_saturation = "1.150000"
pre_bb = "1.250000"
contr = "0.100000"
pre_gc = "0.850000"
sega_fix = "1.000000"
PAL_FILT = "4.000000"
SATURATION = "0.900000"
BRIGHTNESS = "0.950000"
CHROMAF = "1.000000"
GCORR = "1.050000"
pal_ring = "0.700000"
CDETAILS = "0.600000"
gamma_out = "2.100000"
HSHARPNESS = "2.000000"
SIGMA_HOR = "1.400000"
S_SHARP = "0.400000"
HSHARP = "0.600000"
MAXS = "0.080000"
bloom = "0.250000"
halation = "0.250000"
gamma_c = "0.750000"
brightboost = "1.600000"
brightboost1 = "1.050000"
maskstr = "0.350000"
mcut = "0.700000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_mipmap = "false"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_mipmap = "false"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_mipmap = "false"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_mipmap = "false"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
3 Likes

Glsl Buffer handling is different from slang (pot vs. npot texture sizes) and with the slang version some related coding approaches are very intuitive without needing to solve some annoying issues.

So the glsl version was deprecated quite early, but you can use slang shaders with glcore, vulkan, dx11 and dx12 video drivers.

Currently you can use some other very nice (and also fast) glsl shaders if you need to.

1 Like

Meanwhile i implemented a way to achieve a nice smooth image without much hassle. I guess i’ll make a new release version soon including a couple of new features.

9 Likes

New Release Version (2026-05-17-r1):

Notable changes:

  • Re-introducing the “Smart Sharpen Scanlines” feature. Can be quite helpful with slotmask presets.
  • Introducing new “Bloom Pixel Sampling” functionality.
  • Update: small bugfix
  • Update2: functionality improvement
  • Update2: small cleanup

Download link:

https://mega.nz/file/xhACWLIS#f6B5wuGLEFe9bZf_NNjJItjJNdUAkykj6ZZKRynyj7c

18 Likes

Some very nice changes @guest.r:smile:

1 Like

Potential feature suggestion: an “NTSC Connection” parameter with an RGB mode for the NTSC passes, similar to the “PAL Connection” parameter with SCART mode you have in the PAL passes.

2 Likes

Yes, i have been giving it a thought, but it would definitelly bring more enthropy into the existing settings. Currently the default settings are dissolving dithering with the RF/composite/SVIDEO recommendations, which also the users are used they do.

Good news is you can now (added in latest releases) use the NTSC Filtering Scaling parameter to do exactly the same thing as the PAL alternative.

2 Likes

Showing the difference between normal sampling and bloom sampling. To mention it, bloom sampling is also affected by bloom pass settings.

Normal pixel sampling:

Bloom pixel sampling:

7 Likes

New Release Version (2026-05-21-r1):

Notable changes:

  • Separate parameters for emulated display Black Level controls implemented. Now general contrast can be raised (arcade games…) and afterwards added at the same time.
  • Update: Clip Saturated Color Beams also works with Bloom Sampling 1.0 value.

Download link:

https://mega.nz/file/pl5S3KyC#ZJTUuwqYqSSoaRUGrVGX3Zo--2NZ8wkkpPFd4DcqglQ

11 Likes

Guest, how do I know if I properly updated your new version in RA? I looked in the folders and it doesn’t change the dates

1 Like

You’ll get a quite new version if you update Slang Shaders through RA online updater. Folder dates don’t get an updated timestamp i guess, since the “originals” with same names already exist(ed).

To get the newest version from this thread just copy the crt-guest-advanced-2026-05-18-release1 folder’s content into the crt folder of shaders_slang.

Should work without problems on a PC, dunno about phones, steamdeck…i don’t use RA on them.

4 Likes

Roger that, Guest. Keep up the tremendous work as usual.

2 Likes