Please show off what crt shaders can do!

Here’s a simple preset I put together in about 5 minutes, which is all I have patience for these days. It’s nice to move on from tweaking shaders and get on with playing some games for a change. Both are using mask strength 100%. The first shot is with no bloom, the second shot is with bloom. But is the bloom even really necessary? IMO the first shot is plenty bright and the colors are nice and vibrant. I hate what the bloom does to the mask detail with the whites, it irritates my OCD brain, but it does make the colors pop a bit more. It’s a trade-off, at best.

1:

shaders = "12"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
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"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "StockPass"
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"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "AfterglowPass"
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"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "PrePass"
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/avg-lum.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
alias4 = "AvgLumPass"
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/linearize.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "LinearizePass"
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/gaussian_horizontal.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "absolute"
scale_x6 = "800"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "GlowPass"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "800"
scale_type_y7 = "absolute"
scale_y7 = "600"
shader8 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
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_vertical.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = "BloomPass"
float_framebuffer9 = "true"
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/crt-guest-advanced.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "viewport"
scale_y11 = "1.000000"
PR = "0.000000"
PG = "0.000000"
PB = "0.000000"
AS = "0.000000"
sat = "0.000000"
glow = "-0.000000"
brightboost = "2.500000"
brightboost1 = "2.000000"
gsl = "2.000000"
scanline1 = "5.000000"
scanline2 = "20.000000"
beam_min = "1.200000"
beam_max = "1.100000"
scans = "1.000000"
maskstr = "1.000000"
mclip = "0.000000"
gamma_out = "2.200001"
post_br = "1.100000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"

2:

shaders = "12"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
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"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "StockPass"
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"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "AfterglowPass"
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"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "PrePass"
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/avg-lum.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
alias4 = "AvgLumPass"
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/linearize.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "LinearizePass"
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/gaussian_horizontal.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "absolute"
scale_x6 = "800"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "GlowPass"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "800"
scale_type_y7 = "absolute"
scale_y7 = "600"
shader8 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
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_vertical.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = "BloomPass"
float_framebuffer9 = "true"
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/crt-guest-advanced.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "viewport"
scale_y11 = "1.000000"
PR = "0.000000"
PG = "0.000000"
PB = "0.000000"
AS = "0.000000"
sat = "0.000000"
glow = "-0.000000"
bloom = "0.300000"
brightboost = "2.300000"
brightboost1 = "2.000000"
gsl = "2.000000"
scanline1 = "5.000000"
scanline2 = "20.000000"
beam_min = "1.200000"
beam_max = "1.100000"
scans = "1.000000"
maskstr = "1.000000"
mclip = "0.000000"
gamma_out = "2.200001"
post_br = "1.100000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"
3 Likes

This part might depend a lot on how one’s display is configured, for example if it’s calibrated for maximum brightness and being used as a dedicated emulation display or if it’s calibrated and being used for more general use.

I can understand this but do know you can adjust Mask Gamma to compensate for this and there’s a shiny new toy we have been fiddling a bit with recently called magic bloom.

I’m not one who likes to jump on the bandwagon as soon as there’s something new, especially when I’m satisfied with my presets as they are but based on how it works and the fact that I recently raised some similar concerns about the way traditional bloom and glow produced a very general halo that didn’t appear to emanate from the individual phosphors, I gave it a try and have since switched to using negative values for bloom as well as glow.

If you read recent posts in @guest.r’s thread you’ll see users raging over it and some examples of how it works. Some of the examples seem a bit exaggerated for my taste but with subtle use, I think it might be a significant improvement over what we had before.

@guest.r explained that the regular bloom is a relatively simpler implementation. I observed that it applies the glow using “phosphors” and not on top of the mask or around the sprites, graphics or text like traditional glow and bloom are applied. So that might put some of your frustrations at ease.

Give them a try and definitely have a look at the NTSC Filtering settings, which don’t seem to always work in a linear manner. Remember anything that you leave at defaults can potentially offset the sharpness that you’re looking for.

Sharpness and NTSC resolution seem to go hand in hand, sometimes you need less resolution to help with artifacts or dedithering but then you might need to make up for the blur using sharpness and horizontal filtering, (which can also work against your attempts at blending dithering).

It’s good to take a break and also not do too much of anything at the expense of others in your life.

I’m glad to know that all is well with you and that you finally got back to playing games.

2 Likes

Bloom is just a mask mitigation technique i like to use to keep the brightness and contrast in good shape. When the equation darkens with a mask with lesser brightness, slotmask and optionaly BFI, then at least on most desktop displays a mask mitigation approach is a must or brightness and maybe saturation don’t provide a nice or authentic experience.

I used a slotmask TV for a long time as a main TV and these were never an issue. Also when comparing my old 2.0m crt viewing distance with my current 0.5m looks, i like mask mitigation even more.

But it’s purely optional and very helpfull for getting brightness, saturation and the contrast right if needed.

If i would develop the shader with testing on an expensive, bright and large TV it could go a different direction. But i guess i’ll more or less stay a desktop guy.

3 Likes

The loss of mask detail probably isn’t a problem with certain setups, but it’s particularly noticeable on my 27” 1080p monitor when sitting at my desk, less than 2 ft from the screen. With other screen sizes/viewing distances/resolutions, it can be less of a factor.

1 Like

Here’s a bit of a demonstration of the versality of different internal resolutions and scanlines for different looks.

Default: Flycast core set to 1600x1200 (monitor res in my case). Guest HD interlace off, Mask strength full:

Now setting internal res in Guest HD to 3, scanlines become now noticeable at the cost of image quality:

Setting internal res back to default, activating no-scanline mode in Guest. Then attaching res-independet scanline shader as a pass (modded, Hunterk pointed out you can just open the shader file and increase the paramenter range). Different scanline heights: 600, 400, 300

Because that scanline shader also comes with the mask layouts that hyllian etc. provide, it’s possible to quickly test these. Example, shadowmask layout 11, height 300.

1 Like

Hi Hari-82, browsing the forum looking for ideas I found this post of yours and I really liked what I saw. Would you be so kind as to share it please?

Hi @ROBMARK85 , that’s a relative old preset/post but I was and still using guest advanced

This is what my preset looks at the moment:

#reference "shaders_slang/crt/crt-guest-advanced.slangp"
AS = "0.300000"
sat = "0.450000"
TNTC = "1.000000"
CS = "1.000000"
wp_saturation = "0.900000"
pre_bb = "1.030000"
contr = "0.100000"
vigstr = "0.250000"
vigdef = "1.000001"
inter = "300.000000"
interm = "4.000000"
glow = "0.030000"
bloom = "0.200000"
mask_bloom = "0.250000"
bloom_dist = "0.250000"
halation = "0.100000"
scanline1 = "7.000000"
scanline2 = "9.000000"
scans = "0.600000"
h_sharp = "2.200001"
s_sharp = "0.400000"
warpX = "0.030000"
warpY = "0.040000"
csize = "0.050000"
bsize1 = "0.150000"
shadowMask = "9.000000"
maskstr = "0.600000"
slotmask = "0.250000"
slotmask1 = "0.250000"
addnoised = "0.220000"
noiseresd = "1.000000"
post_br = "1.050000"

3 Likes

Thank you very much, as soon as I’m home I’ll try it right away. I really liked the images and was looking for a 1080p preset just for Guest Advance to use with the Duimon package. Very kind.

1 Like

One question, besides the Windows notepad, are there other programs, maybe more specific, to edit “.slangp” files? A thousand thanks

1 Like

text editors like notepad++ or sublime text, etc.

2 Likes

Believe it or not, I use plain Windows notepad for most of my editing.

2 Likes

VS Code is free and really good for this, it also has a great search and replace tool, can search/replace on multiple files.

4 Likes

You guys are all very kind, thank you very much for the help.

1 Like

Hari-82 thank you very much. I managed to create a file with your preset using the smartphone, and always with the smartphone I tested everything, activating the “Magic Glow” option:

I can’t wait to try it on my PC screen as soon as I get home tomorrow. The only advice I need: what should I do to make the colors a little stronger? Thanks again

4 Likes

I set the colors to my liking, so I changed things to have a less saturated look. If you want you can push Saturation back to 1.00 and/or Lut Colors and Display Gamut to 0.

3 Likes

Preview video:

Video Preview

Download: https://github.com/frankschoeman/kyubus-shader

2 Likes

Here’s some stuff I’m working on if anyone is interested. Feedback would be nice.

rgb-cgwg

rgb-lottes

ntsc-cgwg

ntsc-lottes

5 Likes

Hi guys, kindness please. I need to make comparisons with my current preset, could you please share your current settings? Heartfelt thanks for the help.

You can see my settings on my Github if it’s helpful.

One thing I’ll point out is that my display’s backlight setting is maxed out, for a base of about 250 nits (this is a crappy work monitor).

3 Likes