Please show off what crt shaders can do!

Looking for something a little more, try Guest’s shader. 480p looks awesome.

Shouldn’t a VGA connection at 480p be super sharp and not like s-video? (i guess it would be blurry if you connect it to an LCD non native resolution and not a CRT monitor).

Depends on the CRT you connect it to. If it’s a TV, it won’t be sharp. If it’s a high resolution CRT monitor, it will be very sharp. I did that in the past. My CRT TV could take input from my PC through RGB, and my video card (and old ATI Radeon 7500) had RGB output for TVs. It wasn’t nearly as sharp as on my PCs CRT monitor.

The best thing I’ve ever seen in 10+ years of playing with shaders. Indistinguishable from the real thing.

Thread:

7 Likes

From a shader i am working on (improving an old version actually)

4 Likes

This is the crt-guest-advanced-hd preset from New CRT shader from Guest + CRT Guest Advanced updates, tweaked for VGA and SVGA DOS games on a 1440p monitor:

interm = "0.000000"
bloom = "0.100000"
halation = "0.025000"
brightboost = "1.100000"
shadowMask = "3.000000"
maskDark = "0.800000"
maskLight = "1.200000"

(The CRT mask will probably look like complete crap on 1080p… A 1440p display is probably required.)

2 Likes

The above shader i am working (geared torwards a Trinitron TV) has adjustable scanlines so it can do 400/480p too.

It can look like a crap TV or a monitor. Still testing though. But i consider it almost finished.

1 Like

Looks way too blurry for a monitor. Someone on discord made a close-up photo of their CRT monitor:

(The second screenshot is SMW line-doubled on their CRT.)

So CRT monitors in the 90’s DOS era were very sharp.Even 1440p is too low to represent the very fine-grained mask (these monitors were made for high resolutions.) It almost looks like a canvas that’s being painted on. You’d need 4K to get a really accurate representation.

But whatever you can do to somehow make it look as nice as possible on 1080p is of course extremely helpful!

1 Like

Glad to see VGA and PC CRT emulation finally getting some love! I agree, though, that at 1080p, our options are likely going to be quite limited, even more so if we’re trying to emulate a shadow mask. Aperture grilles are, as usual, easier to emulate, but there’s still the matter of the much thinner 400p/480p scanlines. There’s only enough room for one pixel-thick lines at that resolution, so only enough for very basic scanline emulation, with little to no room for things like scanline blooming. 4K gets us much closer in that regard, though only to a point. I’d say 400p/480p emulation at 4K would be roughly analogous to what you can do for 240p content at 1080p.

On another note, I’ve been toying with a Magenta-Green-Black mask pattern (subpixel structure is |RxB|xGx|xxx|), and it seems like a decent alternative to the Red-Green-Blue pattern masks used by several shaders for emulating lower TVL at 1080p, while still retaining a higher TVL count than Red-Green-Blue-Black. While Red-Green-Blue runs into subpixel issues due to the blue subpixel ending up right next to the red one to form magenta (a fact pointed out several times in this thread), this one at least avoids that, and it does not appear to be any darker.

Admittedly, it’s not as accurate as Magenta-Green or Red-Green-Blue-Black, as there’s a wider black gap between each triad than there is between each emulated phosphor (four subpixels between triads versus one between phosphors), but neither is the White-Black pattern in Mask 7, and in practice it looks pretty good.

If anyone wants to try it out, I achieved it in a crude manner (I can’t into shader code beyond a certain point :neutral_face:) by changing the following in crt-guest-advanced:

	// BW Trinitron mask 7 - 9
	else if (shadowMask > 6.5 && shadowMask < 9.5)
	{
		float fdivid = 0.49; if (shadowMask == 9.0) fdivid = 0.70;
		float mdivid = 2.00; if (shadowMask >  7.5) mdivid = 3.00;		
		float maskTmp = clamp(mix( mix(1.0, 0.0, mcut), mix(1.0, 0.0, maskstr), mx), 0.0, 1.0) * dark_compensate;
		mask = vec3(maskTmp);
		pos.x = fract(pos.x/mdivid);
		if  (pos.x < fdivid) mask = vec3(1.0);
	}    

Into the following:

	// BW Trinitron mask 7 - 9
	else if (shadowMask > 6.5 && shadowMask < 9.5)
	{
		float fdivid = 0.3; if (shadowMask == 9.0) fdivid = 0.70;
		float mdivid = 2.00; if (shadowMask >  7.5) mdivid = 3.00;		
		float maskTmp = clamp(mix( mix(1.0, 0.0, mcut), mix(1.0, 0.0, maskstr), mx), 0.0, 1.0) * dark_compensate;
		mask = vec3(maskTmp);
		pos.x = fract(pos.x/mdivid);
		if (pos.x < 0.3) { mask.r = 1.0; mask.g = mc; mask.b = 1.0; }
		else if (pos.x < 0.6) { mask.r = mc; mask.g = 1.0; mask.b = mc; }
	}    

Mask 8 should give the desired result.

There’s probably a better way to do this, of course, as this change outright replaces the BW mask.

1 Like

Actually with 1440p you would be pretty close with a 3 pixel aperture grille RGB and scanlines 2:1 pixels (2 bright-1 black). With 1080p you only have an option for 1:1 thick scanline and 2 pixel aperture grille (magenta-green).

You COULD maybe forego the scanlines at 1080p altogether and just throw a mask on top with just the tiniest bit of blur to maybe simulate a monitor with a high dot pitch or something like that. Might be worth messing around with.

1 Like

If you’re talking about screenshots, then yeah. If you’re talking about what it actually looks like in real life, then you have to take into account how the mask you’re using interacts with the LCD’s subpixel structure.

Actually with those dot pitch of LCD like 0.17mm you can’t even notice mask 0 if you stand more than half meter away. Unless you increase the strength to 0.70-0.80+, so i don’t know if anyone is going to notice that 1 strip gap (of size 0.17mm : 3 = 0.05mm) is missing lol.

If someone plays on 50" TV sure, he will notice because dot pitch is much larger.

We’re talking about different, albeit related things.

The point I’m trying to make is that irregularly spaced subpixels look like an absolute mess IRL. You won’t be able to discern R, G and B stripes using an RGB pattern with RGB subpixels.

So I discovered for whatever reason, the above code for the mask I’m testing results in a slightly darker image than expected compared to Mask 6, which shouldn’t happen if you think about it (subpixel-wise, they both contain the same amount of active and inactive subpixels per triad, so in terms of light output, they should be identical). I decided to modify the code for Mask 6 instead, and I got the expected brightness:

	// Trinitron mask 6
	else if (shadowMask == 6.0)
	{
		mask = vec3(0.0);
		pos.x = fract(pos.x/3.0);
		if      (pos.x < 0.3) { mask.r = 1.0; mask.g = mc; mask.b = 1.0; }
		else if (pos.x < 0.6) { mask.r = mc; mask.g = 1.0; mask.b = mc; }
		else                  { mask.r = mc; mask.g = mc; mask.b = mc; }
		mask = clamp(mix( mix(one, mask, mcut), mix(one, mask, maskstr), mx), 0.0, 1.0) * dark_compensate;

Here’s a screenshot showing off the Magenta-Green-Black mask at full strength:

Here’s Mask 6 (RGB) for comparison:

The difference is very subtle, but I think it works out well for the intended look, at least on a smallish 1080p monitor.

3 Likes

This is a nice idea. :+1: I will most likely include the magenta - green - black mask in the shader.

4 Likes

Another @guest.r shader update, another preset update for me as well. Let’s get straight to it, new and improved Slot Mask preset:

Slot Mask Arcade/32/64/128 bit/480i/Handhelds preset:

shaders = "17"
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 = "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 = "true"
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/grade/pre-shaders-afterglow-grade.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "PrePass0"
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/ntsc/shaders/ntsc-adaptive/ntsc-pass1.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
frame_count_mod4 = "2"
mipmap_input4 = "false"
alias4 = ""
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "4.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/ntsc/shaders/ntsc-adaptive/ntsc-pass2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "0.500000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/custom-fast-sharpen.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "NtscPass"
float_framebuffer6 = "false"
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/advanced/convert-ntsc.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "0.500000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/stock.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "true"
alias8 = "PrePass"
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/advanced/avg-lum-ntsc.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "AvgLumPass"
float_framebuffer9 = "false"
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/linearize-ntsc.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "LinearizePass"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "absolute"
scale_x11 = "640"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = "GlowPass"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "absolute"
scale_x12 = "640"
scale_type_y12 = "absolute"
scale_y12 = "480"
shader13 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = ""
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "640"
scale_type_y13 = "absolute"
scale_y13 = "480"
shader14 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = "BloomPass"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "640"
scale_type_y14 = "absolute"
scale_y14 = "480"
shader15 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc.slang"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = ""
float_framebuffer15 = "false"
srgb_framebuffer15 = "false"
scale_type_x15 = "viewport"
scale_x15 = "1.000000"
scale_type_y15 = "viewport"
scale_y15 = "1.000000"
shader16 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear16 = "true"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
float_framebuffer16 = "false"
srgb_framebuffer16 = "false"
scale_type_x16 = "viewport"
scale_x16 = "1.000000"
scale_type_y16 = "viewport"
scale_y16 = "1.000000"
g_signal_type = "0.000000"
wp_temperature = "8004.000000"
quality = "0.000000"
ntsc_phase = "3.000000"
GAMMA_INPUT = "2.400000"
interm = "5.000000"
bloom = "0.899998"
bloom_dist = "0.900000"
halation = "0.400000"
gsl = "-1.000000"
csize = "0.060000"
bsize1 = "0.300000"
warpX = "0.040000"
warpY = "0.050000"
shadowMask = "10.000000"
maskstr = "1.000000"
slotmask = "1.000000"
slotmask1 = "1.000000"
slotwidth = "4.000000"
double_slot = "2.000000"
gamma_out = "2.399999"
deconrr = "0.750000"
deconrb = "-0.750000"
deconrry = "1.500000"
deconrby = "-1.500000"
decons = "-1.999998"
addnoised = "-0.300000"
noiseresd = "1.000000"
post_br = "1.150000"
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"

Slot Mask 8/16 bit/PC systems preset:

shaders = "17"
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 = "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 = "true"
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/grade/pre-shaders-afterglow-grade.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "PrePass0"
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/ntsc/shaders/ntsc-adaptive/ntsc-pass1.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
frame_count_mod4 = "2"
mipmap_input4 = "false"
alias4 = ""
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "4.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/ntsc/shaders/ntsc-adaptive/ntsc-pass2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "0.500000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/custom-fast-sharpen.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "NtscPass"
float_framebuffer6 = "false"
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/advanced/convert-ntsc.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "0.500000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/stock.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "true"
alias8 = "PrePass"
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/advanced/avg-lum-ntsc.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "AvgLumPass"
float_framebuffer9 = "false"
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/linearize-ntsc.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "LinearizePass"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "absolute"
scale_x11 = "640"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = "GlowPass"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "absolute"
scale_x12 = "640"
scale_type_y12 = "absolute"
scale_y12 = "480"
shader13 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = ""
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "640"
scale_type_y13 = "absolute"
scale_y13 = "480"
shader14 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = "BloomPass"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "640"
scale_type_y14 = "absolute"
scale_y14 = "480"
shader15 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc.slang"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = ""
float_framebuffer15 = "false"
srgb_framebuffer15 = "false"
scale_type_x15 = "viewport"
scale_x15 = "1.000000"
scale_type_y15 = "viewport"
scale_y15 = "1.000000"
shader16 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear16 = "true"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
float_framebuffer16 = "false"
srgb_framebuffer16 = "false"
scale_type_x16 = "viewport"
scale_x16 = "1.000000"
scale_type_y16 = "viewport"
scale_y16 = "1.000000"
GAMMA_INPUT = "2.400000"
interm = "5.000000"
bloom = "0.899998"
bloom_dist = "0.900000"
halation = "0.400000"
gsl = "-1.000000"
csize = "0.060000"
bsize1 = "0.300000"
warpX = "0.040000"
warpY = "0.050000"
shadowMask = "10.000000"
maskstr = "1.000000"
slotmask = "1.000000"
slotmask1 = "1.000000"
slotwidth = "4.000000"
double_slot = "2.000000"
gamma_out = "2.399999"
deconrr = "0.750000"
deconrb = "-0.750000"
deconrry = "1.500000"
deconrby = "-1.500000"
decons = "-1.999998"
addnoised = "-0.300000"
noiseresd = "1.000000"
post_br = "1.150000"
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"

You also must have the latest guest shader update for my shaders to display properly, you can get the latest update here.

If you prefer the warm colors over the cool colors in the first preset simply go into the parameters and press start on “White Point” and it’ll revert back to default.

@HyperspaceMadness when you get a chance please update and replace my previous shaders with these new ones in your bezel project, or if you want to keep them maybe label them “old version” or something, these new presets are the successors to those in any case. Hope you all enjoy.

6 Likes

Coming Up!!!, I should be able to get this an updates to guest’s stuff in the next update

5 Likes

Hi all I thought I’d register my Sony PVM 4K HDR shader on this magnificent thread for prosperity sake.

My latest version is 2.1 and can be found in the ‘hdr’ folder on GitHub slang_shaders. The shader parameters window has the instructions for using it. It will not work for everybody sadly as it relies quite heavily on your display hardware.

Anyway here are the obligatory photos - close up comparisons with my actual PVM of course:

LCD Photos: OnePlus 8 Pro Camera: Pro Mode, ISO 200, WB 5000K, Aperture Speed 1/60, about 10cm from the screen, 48MPixel JPEG.

CRT Photos: OnePlus 8 Pro Camera: Pro Mode, ISO 100, WB 5000K, Aperture Speed 1/60, about 10cm from the screen, 48MPixel JPEG.

Note: my PVM has a slight disadvantage above, as the ISO is at 100 where as the LCD (DisplayHDR 600) is at ISO 200. You can see on my dedicated thread direct comparisons of same ISO shots.

Thread here:

11 Likes

2 shots, one with crt-consumer.glsl and another experimental with same code but with the Guest.r scanlines code (and contrast, corner added). With tiny amounts of noise, that indeed does exist on a CRT even on RGB, it really feels like the real thing. Makes you wanna play :stuck_out_tongue:

That is, except when starts moving and LCD blur gets in lol

4 Likes