Please show off what crt shaders can do!

@Syh - in this particular case, just desaturation. IA is always in the chain though. Resource-wise invisible, yet very handy!

@Nesguy - yeah for the xBM look, I guess 500-600 is plenty (even if 500 is already too high a TVL count for my taste, at least when it comes to emulation). It also depends a lot on the size of the screen, and as you mentioned, whatever you are displaying on it.


@Squalo Have to tried Dogway’s Grade shader? You may be able to swap color-mangler and iA from your chain with it. As it’s basically suped-up color-mangler and it has a vibrance/dull vibrance setting that might do just what your using iA for.


No I haven’t dammit. I think it came at a time when I was away from the internets dealing with some real life heavy stuff and I’m afraid I missed it! Sounds amazing though, is it official?

1 Like

Official as in the repo, no. Official as in it’s awesome and alot of technical knowledge went into for sure, lol.

1 Like

Haha well, where can I find it then!

1 Like

Here ya go, lol. This is it’s thread.

And here is the repo for it. (As it’s not in the first post but I figured you’d like to read through the thread, lol.)


update to my mask dilemma: played around with color levels and gain and I can’t even make a dent in the problem without totally wrecking the image in other ways. This TV basically relies on the green push to get bright enough and there’s severe clipping with red and blue even at moderate levels; it’s awful. I can either have an adequately bright image with green push or I can have correctly balanced colors and a horribly dim image. Good thing it was free :stuck_out_tongue:

So… that’s another potential pitfall when it comes to masks. If the color levels are weird to begin with, then masks aren’t going to work right. Masks can be tricky.

1 Like

The second shot is basically the lowest TVL you can emulate with guest-dr-venom. Lowering the beam min/max values any further causes the scanlines to completely disappear over very bright colors. You can lower scanline1/scanline2 to 15.00/19.00 without making any scanlines disappear.

You can make the scanlines even sharper than those in the high TVL example by increasing beam min/max, at the expense of making the image even darker. The vast majority of displays will struggle to get bright enough with max scanline settings.

First shot uses scanline type 2, second shot uses scanline type 0.

High TVL


Low TVL settings

shaders = "11"
shader0 = "shaders_slang/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/stock.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 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/d65-d50.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "WhitePointPass"
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/afterglow.slang"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "AfterglowPass"
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/avg-lum0.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = ""
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/avg-lum.slang"
filter_linear5 = "false"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "true"
alias5 = "AvgLumPass"
float_framebuffer5 = "false"
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.slang"
filter_linear6 = "false"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "LinearizePass"
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/blur_horiz.slang"
filter_linear7 = "false"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/blur_vert.slang"
filter_linear8 = "false"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = "GlowPass"
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/linearize_scanlines.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = ""
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/crt-guest-dr-venom.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "false"
srgb_framebuffer10 = "false"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
parameters = "WP;wp_saturation;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"
WP = "0.000000"
wp_saturation = "0.900000"
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.000000"
TAPSH = "4.000000"
GLOW_FALLOFF_H = "0.000000"
TAPSV = "4.000000"
GLOW_FALLOFF_V = "0.000000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "0.000000"
scanline1 = "15.000000"
scanline2 = "19.000000"
beam_min = "0.700000"
beam_max = "0.700000"
beam_size = "0.000000"
h_sharp = "3.000000"
s_sharp = "0.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.000000"
maskDark = "0.500000"
maskLight = "1.500000"
CGWG = "0.500000"
gamma_out = "2.200000"
spike = "0.500000"
inter = "400.000000"
interm = "1.000000"
bloom = "0.000000"
scans = "0.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"

High TVL settings:

set beam min/max to maximum and scanline1/scanline2 to 1.00/1.00. Increase as desired. Scanline type 2 is recommended.


Keep in mind that the min/max scanline values ARE display-dependent, as is gamma adjustment. A display with better contrast and color depth will be able to lower the scanline strength more before the scanlines disappear. A display with better brightness will be able to increase the scanline strength more while still maintaining an adequately bright image. For guest-dr-venom, use scanline1 and scanline2 to make large adjustments and beam_min and beam_max for additional fine-tuning.

Fudoh’s 240p test suite can be used to fine-tune settings as desired; just make sure the scanlines are still visible over all colors on the color bars test pattern and that the other test screens look good. The help screen can be accessed at any time by pressing “start.”


@Nesguy What were the settings for the high tvl shot?

1 Like

I like the distinct comparison w/ explanation for this. I like my scanlines like I like my bacon. extraaa thicc! - so it’s nice to know what settings help produce that without doing the squint test.


lol, same here. Thinner scanlines/lower TVL can look nice for some content though, I suppose. I think each look has its own charms, but I still prefer higher TVL most of the time. You can sharpen the scanlines further by increasing scanline1 and scanline2 (scanline dark and scanline bright in the parameter options). Scanline1 controls the thickness over dark colors and scanline2 controls the thickness over bright colors. Use beam_min and beam_max for additional fine-tuning. You can increase these as desired and increase the backlight to compensate until the scanlines are as thick as possible while still having a bright image.


For the high TVL example, here are the differences from the settings I posted:

Increase beam_min and beam_max to maximum values. Set scanline1 and scanline2 to 1.00. Set gsl (scanline type) to 2. Set h_sharp to 4.00.

Did a couple more tests and scanlines are now a bit thinner in the low TVL settings (lowered scanline2 from 21.00 to 19.00). Updated the posted settings.

edit: @SkyHighGam3r

Bear in mind that the min/max scanline settings and gamma settings are display-dependent. There’s really no substitute for firing up Fudoh’s 240p Test Suite and fine-tuning settings. A display with better color and contrast will be able to lower the scanline strength more, and a display with better brightness will be able to increase the scanline strength.


@Nesguy I,

I took your parameters with the reflectionshader guest-venom + GTU I find it really interesting to lower the parameter scanline dark / bright and mount in return beam min / max

I find that there is a little less moire with curvature.

I am in 1080P on a Samsung TV screen that will celebrate these 12 years I tell myself that my screen must be far below those of today.

I am really a beginner regarding mask knowledge, scanline tvl … and my English is limited so it is difficult for me to follow you.

(I have a too recent CRT Trinitron and in 100Hz I admit I do not like the image) so I do not compare.

Your parameters seem to be with a mask-less could you help me from the reflectionshader (guest-venom and / or guestsm)

How do you know you have the right color or the right light see even the right scanlines

Do you use 240P Test-Suite?

Thank you

Most shaders see a huge improvement with 4K and higher resolutions. Brighter displays, better color depth and higher refresh rates are all beneficial for CRT emulation.

TVL = Television lines. Basically, this was used as a measurement of a TV’s resolution back in the day.

A higher TVL means greater phosphor density and more pronounced scanlines.

I think the parameters for the reflection shader should be similar. Guest-SM is designed to be used with the mask.

Yep, I used the color bars test pattern in 240p Test Suite and gradually reduced the strength of the scanlines until they were no longer visible over the brightest colors, then gradually increased the strength of the scanlines until they were all visible again.

For the blur, I just used a variety of sources and eyeballed it. Below 3.00, black lines lose a lot of sharpness and a lot of details in pixel art won’t look right. Above 4.00 starts looking too sharp and anything above 5.00 looks like nearest neighbor- this also depends on the sharpness of the display being used, though.

For color, make sure the display you’re using is calibrated and then check out Dogway’s grading shader. Syh posted a link a few posts up.

Scanline type - you can select this in the parameter options. Type 2 is recommended for high TVL and type 0 for low TVL. Use scanline1 and scanline2 for large adjustments and beam_min and beam_max for additional fine-tuning.

For brightness, you can use a light meter or a smartphone app that measures light and use the white screen in Fudoh’s 240p test suite. You can also eyeball it- you just want to make sure that white is actually white and not gray.

Gray ramp, color bars and PLUGE are all useful for adjusting brightness, color levels, contrast and gamma. You can press “start” at any point to bring up the help screen in Fudoh’s 240p Test Suite.

Bear in mind that display specs/calibration WILL affect the min/max parameter settings. With better contrast and color depth you can reduce the scanline strength even further before they disappear over the brightest colors, and more brightness means you can increase the scanline strength more. I’m not sure, but I think display resolution will also affect this.



Thank you very much for these explanations

1 Like


Even going from a 3 year old TV to my new Samsung last year the improvements are massive, blacks are actual black now, massive boost in screen brightness and obviously the bump to 4K.

TVs are only going to get brighter and high resolution so be a win win for emulation and shader packs, im guessing 8K will be around the point when we can properly emulate CRT masks with the correct brightness levels…exciting times!!

1 Like

Some random images :slight_smile:
(Remember to open in new window and click zoom once to get the even scanlines)

The wierd thing is that it doesnt look as good on my phone as it does on my projector. My phone is a Galaxy S7 Edge, I guess its a 1440p screen? My projector is a 1080p one. On my old 42" lcd tv (720p) it looks horrible (even if I turn off the tv’s scaler). I wonder if it would look good on a modern Oled tv??

Some updates here on my Sega Genesis shader. I modified ProfessorBraun slotmask because i didn’t like how it looked, it was correct for whites, but when a subphosphor was off it looked wrong. I used mask_triad 2.50 for 1080p the other crt-royale settings need to follow along his setup. I haven’t applied signal bandwidth emulation here yet.

BW slotmask

EDIT: mask update (untested)

slot_mask update


This looks awesome! Can you post your preset?


That mask pattern looks surprisingly good at that resolution, it’s not “accurate” in terms of the phosphors/subpixels but it conveys the texture of the mask really well. How does it work? Does Royale scale the mask based on the mask_triad setting? I haven’t played around with Royale much but I may need to give it a try, now.

1 Like

@DevilSingh , Thank you! It’s an update of my ongoing shader for Genesis (and Sega family + SNES) Here’s the chain I used. My settings are a bit different now. By the way, I forgot to convert screenshot to sRGB, oh well, looks good still.

gamma_out = "2.200000"
gamma_in = "2.400000"
gamma_type = "1.000000"
g_vignette = "1.000000"
g_vstr = "50.000000"
g_vpower = "0.500000"
g_csize = "0.070000"
g_bsize = "100.000000"
wp_temperature = "9311.000000"
g_sat = "-0.020000"
g_vibr = "0.000000"
g_hpfix = "1.000000"
g_lum = "0.070000"
g_cntrst = "0.000000"
g_mid = "0.500000"
g_lift = "0.040000"
blr = "0.000000"
blg = "0.000000"
blb = "0.000000"
wlr = "0.950000"
wlg = "1.000000"
wlb = "1.100000"
rg = "0.000000"
rb = "0.000000"
gr = "0.000000"
gb = "0.000000"
br = "0.000000"
bg = "0.150000"
quality = "1.000000"
bw = "0.000000"
linearize = "0.000000"
crt_gamma = "2.200000"
lcd_gamma = "2.200000"
levels_contrast = "1.000000"
halation_weight = "0.000000"
diffusion_weight = "0.130000"
bloom_underestimate_levels = "0.800000"
bloom_excess = "0.000000"
beam_min_sigma = "0.040000"
beam_max_sigma = "0.205000"
beam_spot_power = "0.010000"
beam_min_shape = "2.000000"
beam_max_shape = "2.000000"
beam_shape_power = "0.010000"
beam_horiz_filter = "2.000000"
beam_horiz_sigma = "0.040000"
beam_horiz_linear_rgb_weight = "1.000000"
convergence_offset_x_r = "-0.500000"
convergence_offset_x_g = "0.000000"
convergence_offset_x_b = "0.500000"
convergence_offset_y_r = "0.000000"
convergence_offset_y_g = "0.000000"
convergence_offset_y_b = "0.000000"
mask_type = "1.000000"
mask_sample_mode_desired = "1.000000"
mask_specify_num_triads = "0.000000"
mask_triad_size_desired = "2.500000"
mask_num_triads_desired = "480.000000"
aa_subpixel_r_offset_x_runtime = "0.000000"
aa_subpixel_r_offset_y_runtime = "0.000000"
aa_cubic_c = "4.000000"
aa_gauss_sigma = "0.250000"
geom_mode_runtime = "2.000000"
geom_radius = "1.800000"
geom_view_dist = "2.000000"
geom_tilt_angle_x = "0.000000"
geom_tilt_angle_y = "-0.017453"
geom_aspect_ratio_x = "432.000000"
geom_aspect_ratio_y = "329.000000"
geom_overscan_x = "1.000000"
geom_overscan_y = "1.000000"
border_size = "0.015000"
border_darkness = "2.000000"
border_compress = "2.500000"

@Nesguy I’m not too knowledgeable on crt-royale (or shaders in general), but he modified user-settings.h and user-cgp-constants.h to set the tiling according to the mask size. I couldn’t find the original post where he posted his crt-royale mod when testing these days. I went back and forth modifying the mask to make it look more like some macro shots. He uses the convergence_offset settings to convey an RGB phosphor mask, I think it’s more manageable so I like that, it didn’t look fine for N64 but everything below I guess it’s fine.