Please show off what crt shaders can do!

Thanks! I figured it was the way to go :sweat_smile:

1 Like

8 Likes

Video:

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

5 Likes

Just continuing to showing off what CRT Shaders can do! Here are a two new presets I’ve been working on. One is a Shadow Mask preset and the other is a new Composite Slot Mask NTSC preset. Enjoy!

By the way, I haven’t seen nor heard @Nesguy around these parts in a while. I hope all is well with him.

1 Like

You mind sharing your settings used to get that shadow mask? I wanna try taking a stab at it.

I don’t mind but I was planning to reveal these as well as other settings as part of my next CyberLab Mega Bezel Death To Pixels Shader Preset Pack release. It’s been a while since my last release, so what you’re seeing now is really a sort of teaser/sneak peek preview of my work in progress and a build up to the next release.

I’m actually hoping that things will actually look the same (or at least very similar) whenever the next HSM Mega Bezel Reflection Shader version that resolves issues with the NTSC Filtering settings is released.

The setting that gives the Shadow Mask effect is just regular Mask 6 with a stagger/rotation/offset to match my resolution and viewport scale. What I’ve realized is that it doesn’t seem to be scalable so if the viewport scale is changed the mask may not look the same and the offset might need to be adjusted to suit.

It was also affected by the recent alignment change to the BGR Mask Layout (which was subsequently reverted) so you should probably get close to the screen and adjust the offset until you get the type of results you’re looking for. It’s not too difficult, as you adjust the Mask Stagger you’ll just see the phosphors shift or rotate and you stop adjusting when it looks the way you want.

You can take a look at this post here for an example.

Other than that, you can probably play around with the Mask Size to get the TVL you’re looking for.

Those screenshots actually show 2 different mask types by the way, Shadow Mask as well as Slot Mask.

1 Like

That’s precious information right there, at least I know that since it uses mask 6 which is pretty much for 1080p, whichever preset I come up with I can then make 1440p and 4k versions using mask 10 and mask 12 respectively. That link you posted use mask 5 in the settings and the screenshot there looks nothing like the shadow mask shots you’re using up above but I get the idea.

I just wanted your mask settings really not anything else, looks like you’re saving it all for a release though and that’s cool. Least I know the few settings I have to play with are mask shift/stagger and the crt mask size setting so I should be able to come up with something. In any case thanks for the feedback.

I think there might be more value in teaching someone how to fish. Lol. Especially one with your talents, potential and capabilities.

You might say that that link looks nothing like the Shadow Mask settings I’m using above but not too far below that post, you’ll see my very first released attempts at using the Mask Stagger to create a Shadow Mask. I’ve seen it posted about before and it’s something that I’ve always wanted to try.

Mask 5 is just a B&W version of Mask 6 as far as I can tell. I knew I didn’t want that, I wanted RGB so I used Mask 6 instead.

Then it was pretty obvious that size 1 wasn’t going to cut it because I was trying to match the reference photo in the post.

Yeah, I kinda wanted to present things in a fun and exciting way. I’ve recently hit my 1,000th post so that might be something to make a little fuss and blow a kazoo over.

Usually this would be available already in my pack for all to see but as it is now, not many would be able to apply my exact settings and get those results because of the version of CRT-GUEST-ADVANCE that the current version of HSM Mega Bezel Reflection Shader is using. I understand you’re only interested in the Mask Settings so I guess that aspect may not apply to you as you have access to the latest CRT-GUEST-ADVANCE, in which case the Mask Settings would look the same provided that your Integer/Non-Integer Scale and Viewport Scale settings also match because remember the Mask Stagger looks different even if you change the Integer Scale Offset by 1 for example. At least that’s what I’ve observed so far in my limited testing using different versions of the Shaders, each with their own bugs and kinks to work out.

Only yesterday, I kinda patched together a hybrid version of HSM Mega Bezel Reflection Shader using different parts of different versions and modified shader passes in order to get what you’re seeing there. When I release something I want it to be something that actually works and looks as intended on an actual release version of HSM Mega Bezel Reflection Shader.

I kinda care about these things, that’s why I put in my disclaimer about using my Shader Preset Pack with the version of HSM Mega Bezel Reflection Shader that it was designed and tested for to ensure quality and fidelity.

I’ve only just put together all of my settings in my first few presets today because they’re usually spread across many different files as I iterate when I’m tweaking something. I’m actually still consolidating my new NTSC Slot Mask preset that I’m also using in my most recent screenshot posts into useable and packageable presets.

When you look at the Mask Size settings, there are only 4 available I believe. As for the Mask Stagger Settings, there are only 16 positive and 16 negative increments (of course you can also enter additional values manually). You really have to look at the results in real-time on your particular screen as certain settings can give unwanted artifacts.

So feel free to ask if you would like any additional information on how to match the reference photo in the post or even my screenshots and I’ll be happy to assist.

1 Like

Yeah I’ve seen it around a few times myself and have now also become interested in it

I did a quick tweak eyeballing your pics and ended up using mask size 2 and mask shift 4:

I don’t think that matches up but it’s a start.

Thank you. I’ll more than likely end up going to guest to get some advice from him as well.

1 Like

This is what I’m talking about. If you tried 4, then how does 4.5 look or 3.5? Also, don’t forget the negative values as well. Negative values seem to rotate the Phosphors around a central axis.

I’m sure you’ll get it exactly the way you like it after you play around some more. Besides playing games, isn’t that where the real fun lies?

After you get a setting that you like, be sure to check your graphics for any strangeness that doesn’t look quite right or looks misaligned then you might have to tweak some more.

One thing I’ve recently noticed is that vertical resolution plays a very important role in avoiding all sorts of anomalies with scanlines and masks.

I also prefer this approach because when I retire, it would be better if you knew and understood the why, instead of just the what.

1 Like

-4 seems like the one that’s used in your pics, that’s the next number I ended up trying. In any case I’ll see what guest has to say. I’m also loving how gritty this mask makes the pixels look:

I can definitely see this and aperture grille presets becoming a part of my shader pack easily to complete the mask triangle with slot mask.

1 Like

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