Please show off what crt shaders can do!

3-phase still blends. But not as much as 2-phase. It looks more like svideo, or like composite on a TV that has a very good color decoder. TVs from the mid 90s and later usually had that. There’s been screenshots of CRT TVs posted here where composite was quite sharp and looks pretty much identical to 3-phase in the sonic waterfalls.

3 Likes

Honestly composite is such a mixed bag on CRTs it can go from looking like near RF levels of grunge to almost S-Video levels of sharpness, for tvs made in the same year…

3 Likes

Tbh, we just need to do a new video signal shader, and just fudge the ever living hell out of the effects. (We can achieve “accuracy” for what it’s doing, after we get it looking ballpark :joy:)

Mainly my brain is starting to finally register that our current video signal option are really lacking and odd if I’m being honest. Like I said previously, composite input into a CRT can look drastically different between sets, and I feel like we lack those kinds of controls to make this happen currently.

Granted I completely understand that it isn’t a simple task to just pull something like this out your ass, and with something like I’m describing we have to make a hard choice upfront. (Lots of settings that are hard to grasp and could be potentially problematic to set up “correctly” but lots of fine tuning vs less fine tuning but more stable preset setting situations)

Just some musing, feel free to leave on read :joy:.

EDIT: Btw, NTSC adaptive was definitely a step in the direction I’m crying for. (Tbh I feel like my crying is part of the reason NTSC adaptive exists now ROFL)

3 Likes

4 Likes

11 Likes

My latest test with crt guest advanced NTSC (1440p, slot mask, mask 9). The only difference between platforms is between composite (SNES, PCE, Genesis) or S-Video (arcade). On Genesis, though, I had to use 2 phase NTSC to achieve transparency as it was meant to be, sacrificing a lot of visual clarity. 3 phase is way better, so I’m pretty unsure about what I will choose. Open images in a new tab!

6 Likes

Very nice. What you’re doing is more or less what I’m looking for.

Mind sharing the presets? I’m looking for a slot mask look like that. Are you using any sharpening?

EDIT: Except Sonic, something does not look right there. Is it the same preset on all screenshots?

1 Like

Sure, it’s nothing too fancy, just some precise tweaks.

shaders = "17"
shader0 = "../shaders/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/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/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/shaders_slang/crt/shaders/guest/advanced/pre-shaders-afterglow.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/shaders_slang/crt/shaders/guest/advanced/ntsc/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/shaders_slang/crt/shaders/guest/advanced/ntsc/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/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/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/shaders_slang/crt/shaders/guest/advanced/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/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/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/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/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/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/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/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 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "viewport"
scale_x15 = "1.000000"
scale_type_y15 = "viewport"
scale_y15 = "1.000000"
shader16 = "../shaders/shaders_slang/crt/shaders/guest/advanced/deconvergence-ntsc.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"
WP = "-20.000000"
wp_saturation = "0.900000"
vigstr = "0.200000"
quality = "0.000000"
ntsc_phase = "3.000000"
glow = "0.100000"
bloom = "0.600000"
bloom_dist = "0.600000"
halation = "0.100000"
warpX = "0.030000"
warpY = "0.040000"
csize = "0.010000"
bsize1 = "0.200000"
shadowMask = "9.000000"
maskstr = "1.000000"
slotmask = "1.000000"
slotmask1 = "1.000000"
slotwidth = "3.000000"
double_slot = "2.000000"
gamma_out = "2.000000"
post_br = "1.100000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "../shaders/shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "../shaders/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/shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "../shaders/shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"

This is for S-Video, for composite just switch inside Retroarch. As for sharpening, I’ve played around with “Sharpen strenght”, leaving “Amount of sharpening” as it is. I think 2 is the limit, 3 seems a little too much. Personally I’m quite happy with 0, but as long as you stay in the 0-2 range it’s up to your preference.

The screenshot of Sonic has been grabbed with a minor difference, 2 phase NTSC instead of 3 phase. This way the transparency trick is better, but you lose visual clarity and colors. Just leave the preset as it is if you look for the latter.

1 Like

Thank you!

Yeah, I assumed Sonic was using 2 phase, but it looks like something else is off in the mask. Can’t really say what. Sonic and the game with the red arch look different than all the rest.

EDIT: “Nothing too fancy” is exactly what I’m looking for. I also like @sonkun’s presets a lot but I feel the base picture is changed a lot and I’m looking for something barebones but with a slot mask. I’m open to more recommendations, ofc.

2 Likes

Thank you I’m glad you like my presets. You’re right in that I’m constantly changing the picture,the slot mask pictures above are similar to how I started off when I started doing slot mask presets. At this point I’m just tweaking NTSC settings trying to hit a sweet spot with the sharpness both of my presets, dont want an image too blurry or too sharp but we’ll see how it goes when I post my next update soon

2 Likes

Looking forward to it! I usually use NTSC too. :slight_smile:

Regarding your presets, what should I change to make it suitable for 4K screens? Your presets work, but the slot mask seems too small and not right for 4K. I like the look of low TVL screens.

2 Likes

Try changing the “CRT Mask Size” to 2 or better. I never viewed my presets in 4k so I don’t know how they look that way or if I’d have to further tweak other parameters to get it looking just right in 4k. Hopefully changing that one parameter will do the trick though.

1 Like

Yoooooo @P-Kong i love that fire emblem screenshot! Holy looks so good! Any chance you could share that preset?

1 Like

I like the crisp look ,mind sharing the Preset?

Here’s the Sony Megatron CVM in SDR mode captured off my 2018 Dell XPS with a 4K screen.

Do make sure to play these back fullscreen and in the 4K quality mode.

As always more info here:

8 Likes

It’s crt-royale with minimal tweaks:

#reference "shaders_slang/crt/crt-royale.slangp"
levels_contrast = "0.703125"
bloom_underestimate_levels = "0.390000"
beam_max_sigma = "0.250000"
convergence_offset_y_r = "0.200000"
convergence_offset_y_b = "-0.200000"
mask_type = "0.000000"

It can look a bit dark with dull colors because the goal is to have well-defined mask patterns/scanlines on brighter areas, which requires you to use low contrast and low bloom underestimate level in crt-royale settings. Instead of boosting soft brightness/saturation using something like grade, just switch between the built-in profiles on your monitor. The ones that are brighter and more vibrant should work.

Try using integer scale on both axes if possible for best sharpness. :nerd_face:

2 Likes

Sony Megatron CVM simulation of a 300TVL Sony PVM 1910!

Comparison photos (CRT is first, Sony Megatron is second):

CRT Photos: No idea pictures sourced off the internet

LCD Photos: OnePlus 8 Pro Camera: Pro Mode, ISO 200, WB 6500K, Aperture Speed 1/60, Auto Focus, 48MPixel JPEG.

Video here do make sure play fullscreen and in 4K!

More video’s can be found here:

6 Likes

This may not be the place for it but I had a dumb question; How do CRT shaders actually affect the final output image? For example I know there’s the base mask itself, is that just a straight overlay over the output? And then as far as splitting the image into individual scanlines, or splitting the color of each pixel into its own RGB layout I’m kind of mistified, ha.

I ask because a lot of basic shaders I’ve used nearly look to just slap a mask over the output and blur the image, but for the more intricate shaders there’s clearly a lot more going on.

2 Likes

It’s not a dumb question at all.

At a high level you’re right at a more detailed level you have to simulate the three electron beams as they scan down the screen and excite the phosphors using various old circuits of differing fidelity and power. Add onto that all the different colour and TV standards and you’re getting close.

The Sony Megatron is basically a whole load of bezier curves layered onto top of each other representing various aspects of the beams and phosphors.

4 Likes

They take the image, each shader has it’s own filter to smooth jagged lines trying to do what a CRT does, they do a gamma correction (CRT is 2.5 and LCD is 2.2 so dark areas are darker on CRT), then apply a mask and scanlines. Some extras like saturation, contrast, Glow. Some take into account the pixel brightness when drawing scanlines to create some beam dynamics. Others don’t. The very simple and fast ones just put a mask there and draw a dark line every 2nd line.

2 Likes