Please show off what crt shaders can do!

My TV has a computer color temperature mode which seems to be in between cool and warm temperature modes, lol. So sorta the same.


Oh I like plenty of masks, I just can’t get any to work right on the current display I’m using lol. This current display has bad green push coupled with undersaturated reds and blues and there’s no fixing it without making the image too dim. On top of that, there’s a very annoying auto-dimming feature that is made worse by masks. The only reason I’m using this POS is because it was free and the rest of my stuff is in storage.

Actually, quite a few masks can improve the objective picture quality in addition to providing texture and making the image more interesting. The cgwg masks, the rotated Lottes mask and some BW masks are good, but they all come with certain caveats and some displays can have weird artifacts with certain patterns. There are also some masks which are just bad IMO because they cause clipping and/or chromatic aberration.

I didn’t mean to beat a dead horse but I think it’s literally impossible to get the beam width as thin as it gets on a consumer Trinitron without maxing the scanlines @ 1080p; with higher resolutions you don’t need max scanlines and it’s probably not desirable. When I examined the thinnest lines on a consumer Trinitron they’re like 1/5th the size of the black gap. Since there’s no black space between phosphors with an aperture grille, the only thing limiting vertical detail is the width of the electron beam and beam focus. 1080p doesn’t even really cut it for the beam dynamics. I get that tastes differ though and not everyone is into the super dramatic beam dynamics on aperture grille CRTs.

I’d like to see a video of your display in motion, definitely. I’m curious to see if there’s a reduction of curvature-related moire. I’d like to add a slight curvature effect but the moire always kills it for me.

That’s an interesting tidbit regarding Apple displays and color temp. I’ve also been using a middle color temperature for a while now just because I like the way it looks :stuck_out_tongue: I still prefer 6500K when watching a movie in a dark room, though.

1 Like

Here’s a comparison illustrating what I was talking about regarding scanlines in my previous post. First shot is a cosumer-grade 27" Trinitron. Second shot is guest-dr-venom with scanline type 2 with beam shape parameters maxed out and beam-min and beam-max both at 1.00.

Notice how the thin lines circled in the second shot are even thinner in the first shot, proving that even when the scanlines are maxed out in shaders, the beam dynamics @ 1080p still aren’t a match for an average aperture grille CRT. At 1080p you’re still relying on visual tricks to emulate beam dynamics (darkening the top/bottom of each line by a certain amount instead of actually reducing the width in pixels).

So if anything, the scanlines need to be even stronger just to match the dynamics seen on a regular old consumer-grade 15kHz aperture grille CRT.

Here’s another CRT shot just for fun and to illustrate just how sharp these things actually were. It’s probably even sharper IRL because the camera is adding some blur.

1 Like

You really enjoy arguing with me haha. Yes, I know how Trinitrons look, they are fantastic and produce strong scanlines indeed. Leaving aside the absence of the grill and any bloom whatsoever, and also the warm tones, it is true that the dark part of the image (the scanlines themselves) is very very similar between the shader and the real thing. I give you that. I also like how you solved the sharpness issue, like I told you some time ago. Problem is the bright part of the image (i. e. the game itself). CRT emulation is not just about faithful scanlines, there are many more factors involved. That is why I say that it looks nothing like a tube tv. It is way too muted, look at your own screens! I can barely even see anything in the shader shot. Blacks crushed, whites anemic, gamma all over the place.

As much as I appreciate your proficiency, and the fact that you are helping push shaders to new limits, man I swear I don’t really understand your approach. On one hand you complain about masks darkening the image a bit but on the other you seem hell bent on applying those ill-lit settings of yours that absolutely kill brightness. And yes, I know you can make up for the lost signal by cranking up a capable monitor to 800 nits or whatever, but that’s really not a good solution unless you have a dedicated tv for retro. It will destroy any calibrations and it’s also quite inconvenient, needing to adjust every time you feel like playing an old game. But then again, if you like it like that, all the power to you, you really don’t need to convince me of anything. Now make a preset that looks good in a normal, calibrated environment, and sure, I might get on board. I have told you all this so many times already…

Cool, I will see what I can do.

Regarding Apple, when you calibrate their screens to D65 (which is something that I need to do anyway for work, even if I don’t agree with that standard), they become way warmer and more washed out. Their computers consistently come with iccs that produce high contrast, low gamma (a bit too low for films, in fact) and cooler temps (a bit too cool for films perhaps, although I like it, looks more like real life and whites appear actually white). It has been like that for a long time already (at least 15 years).

D65 is a century old standard that needs a serious update. I believe it is obsolete and I like that a giant such as Apple is pushing something more modern and accurate that takes into account the switch to digital/RGB. Good to know some people around here seem to agree, too :slight_smile:

1 Like

We shouldn’t assume that the CRT in this shot is properly calibrated, and I merely posted these to illustrate the differences in beam width dynamics. I know there are large differences in color, brightness, etc. but for the purpose of this comparison it shouldn’t matter too much. I make no claims to the accuracy of the colors in the shot I posted. What you’re seeing in that shot is a work in progress as far as color and such is concerned.

The image I posted is definitely too dark with a normal backlight setting, but that’s not something that can be fixed without a wider color gamut or introducing clipping, and I prefer to avoid the clipping because I find it more distracting than the lack of brightness, which is easily compensated for by cranking up the backlight.

Color managing these things is a difficult task without a wide gamut display; you’re always going to have either crushed blacks or clipping or poor shade separation. I’ve been playing around with Dogway’s grade shader and still can’t produce the results I want. That’s why the gamma is weird.

Sure, I could jack up bright boost to make the image brighter… but then I’m raising the black level much higher than the SMPTE standard. Actually, the black level in the shot I posted is already a bit higher than the standard for NTSC. The test patterns don’t lie…

A lot of TVs save different calibrations for each input, including all the ones I’ve recently used, and I have a dedicated emulation PC hooked up to one input so it’s not a big deal for me to max out the backlight on that input.

Since you seem willing to sacrifice black level for greater brightness (which has a really bad effect on the contrast ratio), I think I could come up with something that you’d find acceptable. I just personally really dislike how flat these images look with a reduced contrast ratio. On a CRT the highlights jump off the screen. Raising the black level also tends to have a bad effect on saturation, making everything look washed out. I’ll see what I can do though.

Edit: See two posts down; I think these are adequately bright with a normal calibration and still have good saturation and dynamics. What do you think?


This is as dynamic as the scanlines are going to get at 1080p with my display. I followed the method I posted here.

I think this is adequately bright on a properly calibrated display, but cranking up the backlight doesn’t hurt, either. :wink:

Just using regular sRGB gamma because everything else looks weird on this display.

“Now in 9300K!”


Yeah, I’m preferring the sRGB mode, the new mode @Dogway added is nice but my display isn’t calibrated for it. (Super unsaturated looking for me currently, the new mode.)

The colors look nice in that Castlevania screen.

1 Like

Yeah I’m getting similar results. I think if you’re using an sRGB display you need to use sRGB gamma, or POW for some games. The gamma correction works wonders though; I was able to significantly increase the beam width variation after adding grade to guest-dr-venom.

Thanks :slight_smile:

I’m pretty happy with these colors, actually. My biggest gripe when using a cooler temp is that it looks under-saturated. Adjusting the scanlines to be as dynamic as possible also corrected the colors, so that’s pretty cool.

1 Like

I split the saturation into separate RGB channels, and am increasing the saturation at different levels to compensate for this lol. I’m also using 9300k.

The new gamma correction he added, not the mode? I was getting some interesting results with it, haven’t really tried to dial anything in with it yet.

1 Like

I was just talking about the sRGB gamma mode; it definitely improved things in my configuration, at least. Maybe the shader is doing something else to improve the dynamic range, just kinda assumed it was related to gamma.

1 Like

Ohh I thought you were also referring to the crt gamut correction thing he also added, but yeah the sRGB mode is great.

This is what I was thinking about, for some reason, lol.

#pragma parameter g_crtgamut "CRT gamut" 1.0 0.0 1.0 1.0

When you said this.

1 Like

TBH I didn’t even notice that, yet, lol. I’m afraid it’ll be another thing that needs a wider color gamut than sRGB though.


From what I could tell in my limited testing, it was messing with the greens (seems to be adding blue to them or unsaturating them or something, 🤷). It may also be influencing other colors I’d have to ask @Dogway to know for sure, though I imagine it’s messing with the whole color gamut, I just noticed the greens more as I was testing with Super Mario World.

The setting is either ON or OFF, and it’s defaulted to ON.

1 Like

@Nesguy - those screens are beau-ti-ful. I don’t see any of the clipping that you mentioned before. Very pleasant levels of brightness, contrast and blur. Gamma is spot on. Perfect scanlines, and their variability. Fantastic colours. I’m only missing a mask that provides that pixie dust depth we were talking about and you are set. Outstanding, seriously :smiley: Would love to try it, may I ask that you post the preset?


Thanks! I’m glad you like it. :smiley: Colors look just a tad desaturated on my iPhone screen, but that could be due to the slightly cooler temp of the phone screen compared to the TV I’m using. Anyway, if someone finds the colors desaturated they can probably just lower the color temp a bit in the parameter settings.

I think it can be tweaked further; I’m experimenting with raising the beam_min parameter a bit more.

I’ll caution that these settings are display-dependent because the point at which your display starts clipping also determines how thin you can make the scanlines. Check out the guide I made here.

I’m working on revising the steps for maximizing beam variation; thinking of coming up with some kind of scanline test pattern and have the user raise beam_min “until this line is barely visible” or something like that.

And yeah, the mask is a tough one… I’d definitely have to reduce the beam variation by quite a bit since I’m using all the brightness just for scanlines right now.

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_out;g_gamma_in;g_gamma_type;g_vignette;g_vstr;g_vpower;g_csize;g_bsize;g_crtgamut;wp_temperature;g_sat;g_vibr;g_lum;g_cntrst;g_mid;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_out = "2.200000"
g_gamma_in = "2.400000"
g_gamma_type = "1.000000"
g_vignette = "0.000000"
g_vstr = "40.000000"
g_vpower = "0.200000"
g_csize = "0.000000"
g_bsize = "600.000000"
g_crtgamut = "1.000000"
wp_temperature = "9311.000000"
g_sat = "0.000000"
g_vibr = "-0.000000"
g_lum = "0.000000"
g_cntrst = "0.000000"
g_mid = "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 = "2.200000"
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 = "2.000000"
scanline1 = "15.000000"
scanline2 = "15.000000"
beam_min = "1.000001"
beam_max = "0.700000"
beam_size = "0.000000"
h_sharp = "4.500000"
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.000000"
gamma_out = "2.200000"
spike = "1.000000"
inter = "400.000000"
interm = "1.000000"
bloom = "0.000000"
scans = "0.000000"
textures = "SamplerLUT1;SamplerLUT2"
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"

Here are some shots with an aperture grille effect (50%). Followed the same steps to maximize the beam variation after applying the mask. Not sure the mask is adding much at this low of a setting, though. Tried to get gamma/colors/contrast/etc as close to the previous shots as I could. Again, I’m aiming for adequate brightness with a normal calibration, but cranking up the backlight still helps.

Changes from previous settings:

bright boost dark pixels - 1.25
beam shape low - 13.00
beam shape high - 13.00
crt mask - 0.00
mask 0&7 mask strength: 0.50

The CRT gamut option is scaled down to sRGB gamut so no need for WCG. I was looking for the primaries of CRT phosphors and reached to the P22 ones. I thought this sounds familiar, yes crt-guest-dr-venom had this done already so I borrowed the code.

Two things I miss in crt-guest-dr-venom are convergence and inner glass reflection. I don’t think they belong to grade but I can add them to the preset. For glass reflection I used mgba reflection shader ags001-light.glsl, I had to mod it to avoid clipping, I will also add a toggle, I’m a fan of those. For convergence I will look into royale’s code. I also want to add afterglow and persistence to royale.


Reflection sounds cool.

1 Like

I had to change the blending mode from mix to screen to avoid the opposite side effect of darkening.


Glass Reflection

1 Like

Could you show a screen with more black? As right now it’s just looking like it’s brightening the screen imo.

I’m not really getting any reflection vibes from that screen.

1 Like