Please show off what crt shaders can do!

This one works. Thanks so much.

Which internal res do you recommend using with it? 1440x1080? Actually looks good at 960x720 too, heh.

Every time you increase the internal resolution knock the “Overall Scanline Scale” down. (I’m guessing .25 for a double res Dreamcast game.) Than adjust the maskscale X and maskscale Y until you get it how you like. (The Y value doesn’t do anything with the current apreture grill mask.) At 1920x1440 it looks like a Overall Scanline Scale =0.15 looks nice on Cannon Spike. If I cared to run at that resolution I’d probably tweak the mask scale more as well. I’d also recommend adjusting the Mask and Scanline intensity to your liking.


Thanks again. I’ll play around with it :smiley:

Here’s legend of dragoon with that shader. Is it your settings or Nesguys? It’s awesome anyway. *edit - Oops i were suppose to quote Puxirepublic, sorry

@Mickevincent those look like different settings to me. Those shots look pretty good but I don’t think my maxDR preset can be improved on very much; I’ve done a whole bunch of tests and spent a fair amount of time tweaking it. It’s as bright as it can get without introducing clipping or reducing the scanline strength. If someone can improve on it, I’d be happy to know. All my adjustments were made on a 400 nit display; with 500-600 nits you can probably increase beam max to around 150 or so.

A couple shots with current settings for maxDR. The update to the preset is still pending but I’ve posted current settings below. For NES all I did was change CRT gamma to 2.2 and use the composite-direct color palette.

shaders = "8"
shader0 = "shaders_slang/misc/grade.slang"
filter_linear0 = "true"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "WhitePointPass"
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/afterglow.slang"
filter_linear1 = "true"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "AfterglowPass"
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/avg-lum.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "true"
alias2 = "AvgLumPass"
float_framebuffer2 = "true"
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/linearize.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "LinearizePass"
float_framebuffer3 = "true"
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/blur_horiz.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = ""
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/blur_vert.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "GlowPass"
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/linearize_scanlines.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
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/crt-guest-dr-venom.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "viewport"
scale_x7 = "1.000000"
scale_type_y7 = "viewport"
scale_y7 = "1.000000"
parameters = "g_gamma_in;g_signal_type;g_gamma_type;g_crtgamut;g_space_out;g_hue_degrees;g_I_SHIFT;g_Q_SHIFT;g_I_MUL;g_Q_MUL;g_lum_fix;g_vignette;g_vstr;g_vpower;g_lum;g_cntrst;g_mid;wp_temperature;g_sat;g_vibr;g_satr;g_satg;g_satb;g_lift;blr;blg;blb;wlr;wlg;wlb;rg;rb;gr;gb;br;bg;LUT_Size1;LUT1_toggle;LUT_Size2;LUT2_toggle;SW;AR;PR;AG;PG;AB;PB;sat;lsmooth;GAMMA_INPUT;TAPSH;GLOW_FALLOFF_H;TAPSV;GLOW_FALLOFF_V;TATE;IOS;OS;BLOOM;brightboost;brightboost1;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;h_sharp;s_sharp;csize;bsize;warpX;warpY;glow;shadowMask;masksize;vertmask;slotmask;slotwidth;double_slot;slotms;mcut;maskDark;maskLight;CGWG;gamma_out;spike;inter;interm;bloom;scans"
g_gamma_in = "2.500001"
g_signal_type = "0.000000"
g_gamma_type = "0.000000"
g_crtgamut = "0.000000"
g_space_out = "0.000000"
g_hue_degrees = "0.000000"
g_I_SHIFT = "0.000000"
g_Q_SHIFT = "0.000000"
g_I_MUL = "1.000000"
g_Q_MUL = "1.000000"
g_lum_fix = "0.000000"
g_vignette = "0.000000"
g_vstr = "40.000000"
g_vpower = "0.200000"
g_lum = "0.000000"
g_cntrst = "-0.000000"
g_mid = "0.500000"
wp_temperature = "6505.000000"
g_sat = "0.000000"
g_vibr = "0.000000"
g_satr = "0.000000"
g_satg = "0.000000"
g_satb = "0.000000"
g_lift = "0.000000"
blr = "0.000000"
blg = "0.000000"
blb = "0.000000"
wlr = "1.000000"
wlg = "1.000000"
wlb = "1.000000"
rg = "0.000000"
rb = "0.000000"
gr = "0.000000"
gb = "0.000000"
br = "0.000000"
bg = "0.000000"
LUT_Size1 = "16.000000"
LUT1_toggle = "0.000000"
LUT_Size2 = "64.000000"
LUT2_toggle = "0.000000"
SW = "1.000000"
AR = "0.070000"
PR = "0.050000"
AG = "0.070000"
PG = "0.050000"
AB = "0.070000"
PB = "0.050000"
sat = "0.100000"
lsmooth = "0.900000"
GAMMA_INPUT = "3.499996"
TAPSH = "4.000000"
GLOW_FALLOFF_H = "0.300000"
TAPSV = "4.000000"
GLOW_FALLOFF_V = "0.300000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
brightboost = "1.250000"
brightboost1 = "1.250000"
gsl = "2.000000"
scanline1 = "1.000000"
scanline2 = "100.000000"
beam_min = "1.000000"
beam_max = "1.000000"
beam_size = "0.000000"
h_sharp = "3.000000"
s_sharp = "1.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
glow = "0.000000"
shadowMask = "-1.000000"
masksize = "1.000000"
vertmask = "0.000000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
slotms = "1.000000"
mcut = "0.250000"
maskDark = "0.500000"
maskLight = "1.500000"
CGWG = "0.500000"
gamma_out = "3.500000"
spike = "0.000000"
inter = "400.000000"
interm = "1.000000"
bloom = "0.000000"
scans = "1.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron1.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron2.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/lut/other1.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"

I’m going to do a pass on setting a common brightness of the different shader variants of the Mega Bezel and I was wondering if anyone had any suggestions about what should be the common brightness to match.

I was thinking to match Guest-Dr-Venom’s brightness as a starting point.

Any thoughts on what you would suggest as a common default brightness?

If there is anyone wondering what the Mega Bezel is, it’s this:


Guest-Dr-Venom is my base favorite. It seems to give the best results with the least amount of fuss. I’m not sure how it’s brightness is different compared to the other shaders.


It’s a tweak of default crt-guest-dr-venom.slangp. But Nesguy did inspire me in his thread of how thick scanlines got even look (especially 3D/240P contents) on 1080P/LCD.

I always want to get LCD + shader to accurately look to match the real high TVL CRT. Since I have 2 VGA CRT now, Trinitron and typically shadow mask one (which already take shots on that post), both 17" with native thick scanlines on 3840x240@120. Whether PC VGA CRT or P/BVM, in real thick scanlines depend on 2 conditions, high TVL (900+) and physics size (at least > 14").

I found guest.r’s shader with adjusted settings is the only one that accurately enough for the reals. Most P/BVM-like shaders got totally wrong way; They’re more like trying to simulate a CRT on camera shots, not IRL look.


It makes these old games look so good. Cant imagine what they would look like on a real crt monitor if it looks this good on my lcd.

Screenshots from differents presets.

Tight diffusion :

Sharp :

Gaussian shape :

Also 4k users,if your OS uses 150% zoom, press ctrl - (minus) in your browser to have correct aspect ratio ( for me it’s 67%) .


That’s what I’m going for in the MaxDR preset as well. Maximum scanlines while maximizing the dynamic range and keeping brightness within the specification for SD CRTs. Brightness has to come up a lot after applying “max” scanlines (where the gaps between visible lines are 100% black, or as close as possible to black while still having adequate brightness and DR).

I found that raising gamma in/out to 3.50 and bright boost at 1.20 - 1.30 for dark/bright pixel boost resulted in the brightest image without crushing any blacks or clipping. Grade’s gamma should be kept at 2.50 most of the time.

If you can find a way to make this brighter without introducing clipping or lowering the scanline strength, please let me know. I posted my most recent settings in the previous post. The preset is in the /presets/ directory but the update is still pending, afaik (haven’t tried it today, though).

It’s been so long since I’ve had a CRT I can’t recall scanlines being that harsh in contrast. On my 500 nit laptop it looks to dim. I really need to get a CRT someday just to recall how it actually was.

There’s a lot of variety among different models. Some, like 31 khz monitors and professional video monitors, have stark gaps between the scanlines, while consumer sets usually don’t.

1 Like

It shouldn’t be too dim if you max out the backlight setting on the display. I’m using a 400 nit display and it’s plenty bright. I think you need to keep some bloom/glow though, definitely. If you want 0 bloom/glow I think you need at least 500 nits maxed out. Shouldn’t be harsh, either, if you’re sitting a proper distance from the display (maybe 2-3x the width of the display).

These are supposed to be xVM or 31kHz-grade scanlines, not average TV scanlines. Not saying it’s objectively better or anything, that’s just what I’m doing here.

Also, be sure to download the images to view them at original size.

Current settings:

All bloom removed, with clipping (adjust scanline bright to 1.25 - 1.30):

All bloom removed, no clipping (adjust scanline bright to 1.25 - 1.30, lower bright boost dark/bright pixel to 1.25/1.25):


These look really good. Have you posted these presets anywhere?


Thanks,yes here’s the link with the files (expires in 29 days). Copy paste everything or you can rename folders and also directories inside presets too if you want to keep CRT-Royale vanilla.

Link :

Edit: Do not use with directx 10,11,12 drivers,it will work but you will have SRGB forced. Looks best on Vulkan and Glcore.


Here I’ve reduced beam shape high to 80.00, which adds some additional bloom to highlights. This is probably the sweet spot for beam shape high at this level of brightness. If you go much lower than this you need to lower bright boost in order to avoid clipping.


You can also change glow strength to 0.01 to make things even brighter, although I wouldn’t go higher than that because it can look pretty unnatural at higher settings, IMO.

glow 0.00

glow 0.01


Some mid-combo screenshots:


Hey all I wanted to get some feedback on an idea for a retroarch shader loading feature:

@hunterk and I have chatted about this a bit, and the idea for the feature is to have replaceable text in the preset files which would be replaced when the preset is loaded.

@Duimon, @ArsInvictus, @PapaShine, @BendBombBoom, I thought you might be interested in this as well.

We could do things like change textures based on game or core, like


If you had loaded Discs of Tron this would become:


This means that we could have one preset which could be reused and swap out textures for each game used, instead of having to have a preset for each different texture (which is not very fun or manageable).

We could probably also do this for the core’s name

We could also do it for the shader extension so we could have only one shaders_common folder, instead of having them always be in separate directories like shader_slang, shader_glsl, so especially for newer users they could just open shaders from here regardless of what video driver they are using.

for a path to a shader we could put in:


then when this was loaded it could resolve to


if you are in a video driver using slang.

Any thoughts? Anything else you would want to swap out on loading a preset?