New CRT shader from Guest + CRT Guest Advanced updates

Are the TVL results somewhat different for shadow mask shifts, there’s an old thread by Nesguy here where he mentioned that Lottes Mask 4 results in a divider of 3.61 pixels.

2 Likes

TVL could be indeed different with the shader implementation and mask 4 since every other line is half-phosphor shifted and you automatically get more resolution. But i’m not sure about the 3.61 pixels. Maybe it’s correct, but the equation to get it eludes me a bit.

Otherwise the increased TVL look with shifted masks is real.

2 Likes

I get more TVL then also when mask 0/5 is shifted (usually 1) vs the regular 2px divider or do I misunderstand it :thinking:

2 Likes

The classic TVL equation doesn’t seem to work here since in every other line specific color information is ‘allowed’ where it is ‘prohibited’ in previous line.

It’s fine by me if you multiply the TVL of shifted masks 0 / 5 by 1.5, but dunno if it’s accurate by an objective criteria or if it even exists for shifted masks.

3 Likes

@guest.r Watching this video made me want to show what your shader is capable of. :muscle:

shaders = "12"
shader0 = "shaders_slang/crt/shaders/guest/advanced/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/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 = "source"
scale_x6 = "1.000000"
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 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
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 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
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"
AS = "0.000000"
GAMMA_INPUT = "2.000000"
gamma_out = "2.200000"
interm = "0.000000"
intres = "0.500000"
m_glow = "1.000000"
m_glow_cutoff = "0.000000"
m_glow_low = "0.500000"
m_glow_high = "0.000000"
m_glow_mask = "0.000000"
SIZEHB = "0.000000"
SIGMA_HB = "0.050000"
SIZEVB = "1.000000"
SIGMA_VB = "0.050000"
glow = "0.040000"
bloom = "0.030000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "2.000000"
scanline1 = "20.000000"
scanline2 = "20.000000"
beam_min = "1.150000"
beam_max = "1.100000"
beam_size = "0.000000"
scan_falloff = "0.200000"
spike = "0.000000"
scangamma = "5.000000"
h_sharp = "15.000000"
s_sharp = "8.700000"
ei_limit = "0.000000"
sth = "0.000000"
c_shape = "0.050000"
bsize1 = "0.000000"
sborder = "0.250000"
shadowMask = "10.000000"
maskstr = "1.000000"
mcut = "2.000000"
maskDark = "0.000000"
maskLight = "1.000000"
mshift = "-2.000000"
mask_gamma = "10.000000"
post_br = "1.370000"
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"

shaders = "12"
shader0 = "shaders_slang/crt/shaders/guest/advanced/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/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 = "source"
scale_x6 = "1.000000"
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 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
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 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
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"
AS = "0.000000"
GAMMA_INPUT = "2.000000"
gamma_out = "2.200000"
interm = "0.000000"
m_glow = "1.000000"
m_glow_cutoff = "0.000000"
m_glow_low = "0.500000"
m_glow_high = "0.000000"
m_glow_mask = "0.000000"
SIZEHB = "0.000000"
SIGMA_HB = "0.050000"
SIZEVB = "1.000000"
SIGMA_VB = "0.050000"
glow = "0.040000"
bloom = "0.030000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "2.000000"
scanline1 = "20.000000"
scanline2 = "20.000000"
beam_min = "1.150000"
beam_max = "1.100000"
beam_size = "0.000000"
scan_falloff = "0.200000"
spike = "0.000000"
scangamma = "5.000000"
h_sharp = "7.200000"
s_sharp = "0.000000"
ei_limit = "0.000000"
sth = "0.000000"
c_shape = "0.050000"
bsize1 = "0.000000"
sborder = "0.250000"
shadowMask = "10.000000"
maskstr = "1.000000"
mcut = "2.000000"
maskDark = "0.000000"
maskLight = "1.000000"
mshift = "-2.000000"
mask_gamma = "10.000000"
post_br = "1.370000"
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"

12 Likes

For VGA, try advanced-hd instead with mask 13 and shift 3 :wink: Although this is optimized for 1440p (still suitable for 1080p), not 4K.

#reference "../../shaders/crt-guest-advanced/crt-guest-advanced-hd.slangp"
PR = "0.000000"
PG = "0.000000"
PB = "0.000000"
AS = "0.000000"
sat = "0.000000"
vigdef = "0.500000"
interm = "0.000000"
S_SHARP = "1.500000"
HSHARP = "2.000000"
HARNG = "0.000000"
VARNG = "0.000000"
bloom = "0.100000"
mask_bloom = "0.300000"
bloom_dist = "0.500000"
halation = "0.025000"
shadowMask = "13.000000"
maskstr = "0.400000"
mcut = "0.700000"
mshift = "3.000000"
mclip = "0.350000"
deconrg = "0.250000"
deconrb = "-0.250000"
deconrry = "-0.250000"
deconrgy = "-0.500000"
deconrby = "0.250000"
decons = "2.000001"
addnoised = "0.140000"
noiseresd = "1.000000"
noisetype = "1.000000"

Photo of real VGA CRT (from here):

The result with the HD version with above preset is pretty much spot-on (the colors are of course different since one is a photo of a screen and the other a direct screenshot):

Raw image without shaders:

More VGA porn with that preset:

6 Likes

:partying_face: :clown_face:

100k views in the thread, lol.

Thanks for participating, everything was better, easier and more fun with you guys. :smiley:

22 Likes

Next stop 500k then 1 million and more. I’m glad to have helped out here and there and still be apart of this shader journey and I’m sure all the guys feel the same. I plan on releasing another update hopefully later today, gonna tweak my ntsc presets so hopefully I’ll bring even more traffic to your thread when I release it lol.

4 Likes

@guest.r This is a testament to the greatness of your shader, my guy Retro Crisis just made a THIRD video now about my presets. Long live “crt-guest-advanced” 🫡

11 Likes

Yeah, it is a great shader. I first discovered it because the NTSC shader presets in the repo weren’t exactly what I wanted, and trying to coax other CRT shaders to work with NTSC-adaptive seemed like a lost battle. crt-guest-advanced-ntsc was pretty much exactly spot-on with what I wanted for NTSC-based consoles. Also, crt-guest-advanced-hd turned out to be just marvelous for VGA/SVGA-era PC games. And all the knobs and dials I ever wanted are there.

2 Likes

New Release Version (2023-03-11-r1):

Notable changes:

  • Slotmask Size changed to Slotmask Thickness, odd pixel widths are possible now with thickness 2.0… Presets which use increased slotmask size are affected, but should be a rare occurrence.
  • HD version has now separate bloom and glow passes.
  • Magic Glow added to the HD version.

Download link:

https://mega.nz/file/ohwWQI4Q#uERK0LS96BPUDe-2t2RWmupntH3lURjxzPhef8e9h-o

17 Likes

Magic glow added to HD huh. I’m so invested in the standard version now even though HD was my favorite. Gonna be Interesting times ahead when I come home later and play with this update, curious about those Slot Mask size change as well. Thanks as always.

1 Like

Standard version is very fine with regular resolutions. You might consider the HD version with 'laced content, as an addition to existing presets or maybe with pre-scalers.

1 Like

That was fast! Ask and ye shall receive. You rock.

2 Likes

Ok. I’ll take a look at everything later, I don’t even know what’s the next move I’m gonna make at the moment. Either stay with standard or go back to hd, I’ll see after I update my RetroArch and your shaders.

1 Like

I want to have your baby! :stuck_out_tongue:

4 Likes

Looks like I chose the right time to return to these forums.

5 Likes

Wow! It’s been long I haven’t tried the HD version. This latest version is awesome :astonished:

6 Likes

Meant to ask the other day but now that I’ve started working on new settings I should ask now instead of later. With this change of Slot Mask Size settings to Slot Mask Thickness which number should be used for 1440p and 4k? I know 1 is good enough for 1080p.

1 Like

I believe you’re still going to want to use thickness 1 even at 4k if you want to maintain realistic dimensions. Of course, anything goes if you’re going for an artistic interpretation, but if you want realistic dimensions than a thickness of 2 would require that each triad be 6 pixels tall. So 16x vertical scale for a mere 2 triads per scanline (which is very grainy, like a 9" TV or something, I dunno).

2 Likes