Please show off what crt shaders can do!

9300K, guest-advanced, no clipping. 100% mask strength.

shaders = "12"
shader0 = "shaders_slang/misc/grade.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"
g_crtgamut = "0.000000"
g_vignette = "0.000000"
bg = "0.005000"
WP = "-100.000000"
pre_bb = "0.800000"
GAMMA_INPUT = "2.399998"
glow = "0.000000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "2.000000"
scanline1 = "10.000000"
scanline2 = "12.000000"
beam_min = "0.850000"
beam_max = "0.850000"
vertmask = "0.500000"
scans = "2.000000"
h_sharp = "5.199976"
maskstr = "1.000000"
maskDark = "0.000000"
maskLight = "1.000000"
mask_gamma = "2.399998"
mclip = "0.000000"
gamma_out = "2.299998"
post_br = "1.700001"
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"

Looking good even on my old 900p monitor under standard conditions (that is, it’s bright enough as is, no dim room or alteration to the shader) :smiley: :clap:


I think I need to rework all my presets now :stuck_out_tongue:


These colours look so much more “right” to me than in any other screenshots you’ve posted before!


Yeah that NES color palette is like a whole vibe.

It’s based on the CXA2025AS decoder, used in Sony TVs. With the 9300K temp it causes nostalgic warm and fuzzies.


Here is some interesting stuff with yesterplay’s DosBOX ECE GLSL Shader support off Tyrell’s Depo

This is Warhammer: Shadow of the horned rat for win 3.1, the preset in question is CRT-Easymode-Tweaked with some brightboost + reshade’s own hdr, old denoise(restored because crosire removed this off its newest updates) CAS sharpening and Pd80 Color contrast, the result gave this sharp but higher res look for it.


Here’s another tweak, this time I’m doing something a little different. I made a couple presets this time for both the NTSC US and J phosphors with different temperature settings (cool and warm) for you guys to play with:

You must have guest’s latest shader update for my presets to display properly which you can find here.

Not everyone likes the cool temp then some may not like the warm temp so this post should give something for everyone. For shaders 5 and 6 I also recommend raising the White Point parameter up to 11504 which is what I should have set it as from the beginning, looks better to me.

@HyperspaceMadness this set will replace the last set and you can add all the new presets into the mix as well. As always, hope you all enjoy.

Edit as of 4/26: If you downloaded the pack yesterday (4/25) please redownload it, I made a slight edit to the shaders.

Edit 2 as of 4/28: I fixed a few brightness issues so if you downloaded the pack please redownload it again, this should be the last edit.


540 TVL preset, 6500K, no phosphor gamut

NTSC-U. Red gets clipped

NTSC-J. Blue gets clipped

I’m wondering if using a wide color gamut display with the appropriate color space setting solves this, or will test bars always show clipping? This needs to be tested further.


In regards to phosphor gamuts- the following is taken from the readme for guest-advanced (emphasis added). The same thing applies to the grade phosphor gamuts.

“CRT colors” changes the default colors to something more close to what the RGB Phosphors in CRTs produce.

These profiles are about subtle changes, but if you were used to the display of CRTs you may remember the display having more vivid greens, softer yellows and red, etc. It all depends on the type of CRT you were looking at, but admittedly CRT colors are different from the default sRGB color gamut that is prevalent in today’s LCD screens.

The CRT colors are based on research of the CIE chromaticity coordinates of the most common phosphors used back in the day. Therefore we ended up with 3 “specs” which are EBU standard phosphors, P22-RGB phosphors and the SMPTE-C standard. These three profiles can be selected under “CRT colors” as number 1, 2 and 3.

Then there are two additional “calibrated” profiles that actually quite closely match a Philips based CRT monitor and a Trinitron monitor. They are profile number 4 and 5.

Some more information on these profiles can be read below.

The main drawback currently is that Phosphor color primaries are partly outside the sRGB spectrum, such that for these profiles a “Wide Color Gamut” monitor is needed / recommended. This is what the “Color space” option is for. If you happen to own a monitor that is able to display DCI-P3 color gamut, then set this option to “1”. Option “2” is for AdobeRGB and “3” for Rec. 2020. DCI-P3 is verified to be quite accurate.


thanks for sharing bud. Looking beautiful any of them.

1 Like

I dont know if there is much to these colour transforms - as far as I’ve seen the matrices are just the standard colour transforms that are defined in the ITU-R standards: rec. 601, rec. 709, rec. 2020 etc. I’m not sure there is any need for wide colour gamut monitors they are just transforming the colours between those various standards.

The ones you mention are transforming from the two rec. 601 standards (525 lines/625 lines) to rec. 709. You can then use others to move into wider colour gamuts if you wish such as DCI-P3 or AdobeRGB, rec. 2020 etc.

You can see them all here and the other ones such as DCI-P3, AdobeRGB and ACES (Chapter 14: Colour Primaries):

Certainly this is what the Sony Megatron uses and it matches all the matrices found in Grade and Guest Advanced as far as I can see (you need to transpose them btw).


Thank you, I’m glad you like them. For the 8/16 bit presets I was planning on dirtying up the image with a lot of noise to give a more “analog” look if that makes any sense but decided to just leave it the way it is. Here’s some examples of what I meant,

No noise:

Extra noise:

No noise:

Extra noise:

The settings I used for the noise were “Add Noise” at -0.60 and “Noise Resolution” at 1.00. Using those settings washes out the colors and smears the mask a bit but for some reason I liked how it looked, in the end I didn’t end up using those settings though but it was an alternative at one point.

1 Like

if you have any other Composite-looking shader/preset for Sega Genesis, you’re pretty welcome. I think that type of connection looking fits very well that console. I don’t know, it’s a personal preference but I think along with NES/SNES seem to fit better off that old school games era.

Those are all the presets I have that I posted up there so far and I agree, all the old systems from that era look good with the composite/RF look

what is the address to locate your other presets ? once again thank you for it bud.

I’m not sure I understand. The CRT color profiles are all NTSC gamuts, which are wider than the sRGB gamut. Anything outside the sRGB gamut will be clipped and colors won’t display with the proper saturation, right? You need to use a gamut that’s as wide as NTSC, like rec 2020 or DCI-P3, AdobeRGB etc. To use one of these you need a wide gamut display, correct?

I think I’ve misunderstood you.


There are no others, they’re all in the link I posted above in that shader post

Yeah so there are a number of things to unpack here. First let’s start with the matrices - I’m not sure how good your linear algebra is but essentially you can think of a matrix transforming one space into another i.e from your square dining room into your rectangular kitchen say or more pertinently from your rec.601colour space to rec. 709 colour space.

A correct transform matrix can never move a point inside a bounded region of a source space to outside the equivalent bounded region of a target space. As in if a blue is not being clipped in rec. 601 then the correct transform matrix will not make the equivalent blue clip in the target colour space.

There’s a slight kink in the simplicity because all these colour matrices transform into an intermediate colour space: CIE XYZ but we can ignore that here.

Ok so we could go on for pages about linear algebra so let’s stop there. Next ‘NTSC is a larger colour gamut at least in the blue direction than sRGB’ (to paraphrase) is that really true? NTSC is rec. 601 525 line colour space and sRGB is identical to rec. 709 colour space it just uses a different gamma curve. So did the engineers really make rec.709 smaller than rec.601 in blues? I’m not sure I’ve seen that written anywhere but I’m willing to be proved wrong.

Then onto the next thing your displays actual colour space Vs theoretical standard colour spaces. When a monitor says 95% DCI-P3 it’s only capable of displaying 95% of DCI-P3 colours and colours outside of that, the 5% will get clipped i.e be the same colour as one of the 95%. However what those 5% of colours are you don’t know and will change from monitor to monitor let alone, model to model or make to make.

Lastly if your TV is doing any kind of colour transforms as in brightness, contrast etc it could well push the colours outside of the colour space that your TV is capable of and so result in clipping.

Whether any of that has anything to do with what you’re seeing I don’t know but I hope it helps in finding the issue or making more sense of it.


I am not sure that rec 601 is the color space for NTSC. It’s the standard for SD content, introduced in 1982. And yes, it’s practically identical to rec 709. NTSC is its own RGB color space, introduced in 1953 by the FCC.

Can you explain this diagram? This pretty clearly shows that NTSC is a wider gamut, no? Btw it’s mostly wider in greens as you can see:


Yes, but you cannot use a transform to display a wide color gamut on an sRGB display and not get a clipped and incorrect image, correct? It’s not the transform causing the clipping it’s the fact that the display can’t display all the colors you’re giving it.


Lastly it’s all about of representation of the RGB (#,#,#) values. A calibrated dci-p3 for example represents and produces colors which weren’t present on the ordinary crt displays, giving a too saturated look, since primary colors, mostly green, have different chromatic.

In GDV, for example, a calibrated dci-p3 display when selecting the dci-p3 gamut should produce colors as seen on a sRGB limited display.

Selecting an appropriate color profile can bring colors closer to the desired crt look, but sRGB doesn’t differ too much from established crt phosphor specs.

It makes less sense to narrow the gamut on the sRGB calibrated/capable display, since the transformation is relative and will result in loss of saturation.

Reverse transformations to fake a wider gamut are a bit silly though and could give weird results. It’s best to just increase saturation a bit if someone wants more saturated colors.