Please show off what crt shaders can do!

Thank you, I’m glad you guys like it. First I fixed up the brightness then the sharpness because who wants to play a game where it’s too bright and it’s hard to read the text, then I pretty much got rid of the moire that was bugging me. I’m not sure what else needs to be tweaked at this point.

I might just have to start a thread the way I’m always tweaking it lol, I also took your advice and added a dl link, that should make the shaders even more accessible now.


Pretty much satisfied using this on HSM/Cyber with various core res sampling/mdapt values (and vba-colors from that one GBA/DS phat color accuracy thread).

Still tinkering with gamma and such because Donkey Kong Country for the GBA is so hideous.

Settled with PAL on Grade because it feels the most “at home” for me; I spent months tinkering with my own colors based on my gut feeling, but decided to just reset most of the colors and not change too many settings.

For example, SNES Donkey Kong Country has the Kong skin shine too much (especially on darker stages). Also, red background objects, purple cave crystals and the ground on the first stage never ended up looking right until I just ended up resetting most of my settings.

If I feel like it, I may post comparison pics. I looked and I somehow didn’t save any, otherwise I would post them.

#reference "Mega_Bezel_Community/CyberLab/MBZ__2__Performance_No_Reflections/4K_Optimized_Presets/CyberLab__Composite-Sharp__PVM-Edition__ADV.slangp"
MDAPT_MODE = "0.000000"
SGPT_ON = "1.000000"
SGPT_BLEND_OPTION = "6.000000"
SGPT_BLEND_LEVEL = "0.000000"
compositeConnection = "1.000000"
signalResolutionI = "175.000000"
signalResolutionQ = "175.000000"
AS = "0.200000"
g_crtgamut = "3.000000"
g_cntrst = "0.000000"
glow = "-0.000000"
SIZEH = "6.000000"
SIGMA_H = "1.200000"
SIGMA_V = "1.200000"
halation = "0.000000"
SIGMA_HB = "0.700000"
SIGMA_VB = "0.700000"
gamma_c = "1.000000"
gsl = "0.000000"
beam_min = "1.300000"
beam_size = "0.600000"
vertmask = "0.000000"
spike = "1.000000"
h_sharp = "5.200000"
shadowMask = "7.000000"
maskstr = "0.300000"
maskDark = "0.500000"
slotms = "1.000000"
deconrr = "-1.000000"
deconrb = "1.000000"
deconrry = "-1.000000"
deconrby = "1.000000"
addnoised = "0.200000"

For, say, DOS/PC-96 games; is there any way to achieve this effect?

Should be a very simple mask I assume, but I have no clue where to start.

Ah; I had recent pics on Discord. GBA I am still playing around with; I disabled GTU and chose the 8th mask for starters


Well it seems like you’re trying to achieve a Shadow Mask effect which was common in PC-Monitors. You can start with any of my Computer Monitor presets and adjust the


I see you have it at 1400 here. That should work to remove the thick scanlines. You can also try a setting of 200.

Then you can adjust the mask size and strength to taste or even experiment with other mask Types from 1-4.

1 Like

The magenta green checkerboard pattern is the closest you can get. I don’t know if it’s been incorporated into guest-dr-venom.


With the recent versions one can use the ‘mask shift’ option to create such a pattern. RGBX (mask 10) with mask shift of 2.0 can also be used.


Very nice preset! Now it’s my favorite!


Aside from all of them being too blurry, there’s a weird “mid-scanline swell” that often occurs with the NTSC shaders. It’s not aesthetically pleasing IMO, nor is it accurate. Unfortunately nothing I do seems to fix it.

The NTSC shaders/filters are a tricky beast. If you try to make them sharper using the available methods, it does weird and undesirable things to the scanline taper (scanlines should smoothly taper from one pixel to the next as the color/brightness changes), and/or it introduces ringing or other undesirable side-effects.

I thought introducing some scanline deconvergence might help with the mid-scanline swelling, but nope. Still there. You can see it in the “G” very clearly, in Sonic’s eye, and elsewhere.


These are very over-saturated but perhaps that’s a personal preference. I also do not care for how much glow/bloom/whatever there is in the brights, causing the mask detail to be completely lost, but that’s a necessary evil if you want things to be bright enough on non-HDR screens.

1 Like

If you don’t care about blending the dithering pixels, a larger horizontal scale factor (like x6 to x8) in pass 1 usually looks good enough with some NTSC artifacts on. The perceived sharpness should be close to composite input. Try the following preset and play some Revenge of Shinobi. It looks pretty authentic on my monitor.

shaders = "14"
shader0 = "shaders_slang/ntsc/shaders/ntsc-adaptive/ntsc-pass1.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
frame_count_mod0 = "2"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "6.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/ntsc/shaders/ntsc-adaptive/ntsc-pass2.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "0.500000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
float_framebuffer2 = "false"
srgb_framebuffer2 = "true"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
float_framebuffer3 = "false"
srgb_framebuffer3 = "true"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "viewport"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-approx.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "BLOOM_APPROX"
float_framebuffer4 = "false"
srgb_framebuffer4 = "true"
scale_type_x4 = "absolute"
scale_x4 = "320"
scale_type_y4 = "absolute"
scale_y4 = "240"
shader5 = "shaders_slang/blurs/blur9fast-vertical.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "true"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/blurs/blur9fast-horizontal.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "HALATION_BLUR"
float_framebuffer6 = "false"
srgb_framebuffer6 = "true"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "64"
scale_type_y7 = "viewport"
scale_y7 = "0.062500"
shader8 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-mask-resize-horizontal.slang"
filter_linear8 = "false"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = "MASK_RESIZE"
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
scale_type_x8 = "viewport"
scale_x8 = "0.062500"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
float_framebuffer9 = "false"
srgb_framebuffer9 = "true"
scale_type_x9 = "viewport"
scale_x9 = "1.000000"
scale_type_y9 = "viewport"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-brightpass.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "BRIGHTPASS"
float_framebuffer10 = "false"
srgb_framebuffer10 = "true"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-vertical.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "true"
scale_type_x11 = "source"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-bloom-horizontal-reconstitute.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = ""
float_framebuffer12 = "false"
srgb_framebuffer12 = "true"
scale_type_x12 = "source"
scale_x12 = "1.000000"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/crt-royale/src/crt-royale-geometry-aa-last-pass.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "true"
alias13 = ""
float_framebuffer13 = "false"
srgb_framebuffer13 = "false"
scale_type_x13 = "viewport"
scale_x13 = "1.000000"
scale_type_y13 = "viewport"
scale_y13 = "1.000000"
quality = "-1.000000"
ntsc_fields = "1.000000"
ntsc_phase = "3.000000"
ntsc_sat = "1.250000"
cust_fringing = "1.500000"
cust_artifacting = "4.500000"
levels_contrast = "0.781250"
halation_weight = "0.030000"
diffusion_weight = "0.045000"
bloom_underestimate_levels = "0.570000"
convergence_offset_x_r = "-0.300000"
convergence_offset_x_b = "0.300000"
convergence_offset_y_r = "-0.300000"
convergence_offset_y_b = "0.300000"
mask_type = "0.000000"
border_size = "0.000000"
border_darkness = "0.000000"
border_compress = "1.000000"
textures = "mask_grille_texture_small;mask_grille_texture_large;mask_slot_texture_small;mask_slot_texture_large;mask_shadow_texture_small;mask_shadow_texture_large"
mask_grille_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64.png"
mask_grille_texture_small_linear = "true"
mask_grille_texture_small_wrap_mode = "repeat"
mask_grille_texture_small_mipmap = "false"
mask_grille_texture_large = "shaders_slang/crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5Spacing.png"
mask_grille_texture_large_linear = "true"
mask_grille_texture_large_wrap_mode = "repeat"
mask_grille_texture_large_mipmap = "true"
mask_slot_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64.png"
mask_slot_texture_small_linear = "true"
mask_slot_texture_small_wrap_mode = "repeat"
mask_slot_texture_small_mipmap = "false"
mask_slot_texture_large = "shaders_slang/crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacing.png"
mask_slot_texture_large_linear = "true"
mask_slot_texture_large_wrap_mode = "repeat"
mask_slot_texture_large_mipmap = "true"
mask_shadow_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearShadowMaskEDPResizeTo64.png"
mask_shadow_texture_small_linear = "true"
mask_shadow_texture_small_wrap_mode = "repeat"
mask_shadow_texture_small_mipmap = "false"
mask_shadow_texture_large = "shaders_slang/crt/shaders/crt-royale/TileableLinearShadowMaskEDP.png"
mask_shadow_texture_large_linear = "true"
mask_shadow_texture_large_wrap_mode = "repeat"
mask_shadow_texture_large_mipmap = "true"
1 Like

I do care about that though :confused:

1 Like

Maybe applying a de-dithering shader before the NTSC shader :joy:

Ideally if those de-dithering shaders used a similar method to blend dithering pixels like how the NTSC shader blends everything, the worse artifacts we would see should be some slightly blurrier and bleeding pixels around the suspicious patterns. (no?) But they seem to always produce other unwanted/uglier artifacts so I suppose that’s not a viable option.

1 Like

Some side-by-side shader tweaking with my Sony Trinitron as reference

shaders = "1"
feedback_pass = "0"
shader0 = "shaders_glsl/crt/shaders/crt-guest-cgwg-curvature.glsl"
filter_linear0 = "true"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
brightboost = "1.450000"
sat = "1.350000"
scanline = "4.000000"
beam_min = "1.650000"
beam_max = "1.350000"
h_sharp = "1.600000"
gamma_out = "0.450000"
maskDark = "0.400000"
maskLight = "1.000000"
CGWG = "0.700000"
warpX = "0.030000"
warpY = "0.040000"
vignette = "1.000000"

Thank you, I’m glad you enjoy it. It’s constantly being tweaked so who knows when you’ll see me post up another preset in time. @Nesguy let me see you tweak my preset, show me how you’d come up with a Slot Mask preset since you always got something to say. I told you before I’m not going for anything accurate here. When the technology arrives where shaders can be displayed with a 1 for 1 accuracy to a crt then they’ll be no more need for using blooms etc. Until then I’m just having fun my way with these shaders, it’s not that serious.


How do you go about porting between Guest-CRT-Advanced and HSM Mega Bezel Reflection Shader so seamlessly?

1 Like

Have you seen the PVM HDR shader thread? Amazing stuff going on there.

For me, accuracy and aesthetics are the same thing when it comes to CRT shaders.

I’ll take a look at your presets, but I think we just have different ideas about what looks good.

Yes I have been in that thread a few times, I’m not really a fan of pvm or the bvm style. I never owned a tv like that in the 90’s I always gamed on aperture grille type tvs. I always loved the slot mask type tvs but never owned one either and yes we’ve been seeing things differently when it comes to shaders since I started posted here months ago this isn’t our first time getting into it lol. But yeah it’s up to you if you want to play with those presets. My presets usually come together from others while I’ll add my little twist to it here and there


Not sure I understand, PVMs and BVMs are both aperture grille displays.

Slot masks and dot masks have both been added to the shader in question. That shader probably needs a new name, now…


I think the pvm/bvm comment was about the scanlines on the display (aka more prominent scanlines vs non-existent seeming scanlines), obviously they share the same style of masks.

Side note, I need to save a little bit up still, but afterwards I should be able to go back to working on shader presets, with actual references for the presets. (Currently need to build a new PC, mine gave up, but I should be able to work on presets for RF to Component, with my current reference setup)

The CRT I’m using as a testbed is on the larger size, has a slotmask, and the scanlines are pretty interesting on the set imho. (They are fairly think and prominent on darker colors but bright colors bloom out the gaps I’m assuming, as I have like paperthin lines over bright colors. So nice taper is happening imo)


Has it been calibrated? You can probably reduce the beam width over brights by playing with contrast.


Yes that’s exactly what I meant with the prominent scanlines I was just coming here to clear that up lol. I never felt those type of tvs were good for gaming for some reason