Please show off what crt shaders can do!

There are rolling (animated) dotted artifacts too, but i decided not to implement it (not to recreate every single system on this earth on one shader lol), just left it use pce320 7.14mhz clock on pal alternate lines.

Yes, more or less.

1 Like

Using Mask 0. It looks really good.

Mask 6

4 Likes

Hey Boss! Something’s wrong with the screen! :grin:

9 Likes

This last update is amazing, I’m really happy with it :smiley:

3 Likes

:grin:

6 Likes

7 Likes

Looks good but needs something for the high contrast edges- those black lines should be sharp and thick, not blurred.

This is composite video, the sharpness you see here is nothing special, you’ll see the same sharpness on any ratty early 90s set that isn’t broken:

That’s plain hardware bilinear horizontally and a blurrier than normal smoothstep (i intentionally tweaked it to be blurrier, default sharp one was giving me that artificial/fake vibe) vertically. Mostly a test/proof of concept to see what can be done without tricky horizontal filtering like lanczos etc. Gives a pretty convincing crt-like pixel shape.

Full power mask on medium to dark areas, compensate with some small glow/boost tricks. All injected to “crt-sines” slang shader.

2 Likes

Regarding bilinear, even if it’s just horizontal, how do you guys feel about it? I tend to run away from it as much as possible. Full amount bilnear filtering looks hideous to me now that I can play and apply crt filters in high resolutions. Destroys pixels and messes up brightness, taking away a lot of “crt feel” from the image. It used to be a cheap, easy way out back in the day when I was forced to do 720p, but nowadays I avoid it like the plague. There exist way, way better interpolation methods imo.

1 Like

If video cards were used to do finance calculations, the bilinear filter would make more sense.

The bilinear filter is, in all honesty, best treated as a legacy function. It is so important because so much relied on it, but it doesn’t behave like light does in nature, and it doesn’t work as a good signal interpolator either. At least nearest neighbor allows you to reconstruct more natural signals by filtering, like carving a sculpture from marble. And point sampling is similar, just in the opposite way, where it’s a foundation to add things. Bilinear isn’t flexible that way.

Bilinear is really fast and is still a useful scaler for a size between 0.5 and 2.0 of the input because it can be so fast, but if you have performance, there will be a better choice.

3 Likes

Bilinear is not to be used “as is” on a shader as it gives hideous results. But at this particular case i twisted shapes by adding some glow/boost that will alter shape the way i wanted it to look. I can use whatever i want to, like lanczos, gaussian, quillez, smoothstep or whatever, i just want to try new things every now and then, just for the fun of it. All of them can look good with some tweaking etc.

2 Likes

And those Zelda shots look great :slight_smile:

My approach now (for 240p) is to make sure that the Y axis is supersharp (nearest neightbour sharp) and then interpolate/soften up horizontally to taste.

Here by the way is the Sony-est, most vivid look I have attained so far. Heavy lines and mask, lots of brightness, no discernible clipping or lost detail either in highlights or shadows. When it comes to this specific presentation, which is my favourite type of crt, I really don’t see how I could push things any further without some form of dynamic brightness control in place.

10 Likes

Yeah there is a limit how much you can do on these screens and it’s pretty good already. Most CRTs would never look this good anyway. Actually most shaders, even zfast do look much better than an average CRT.

1 Like

It depends on what specific qualities you’re looking for, CRTs still beat LCD in motion clarity, and very often in contrast ratio, unless you’re talking about higher end displays. In general I agree, though. CRT shaders are so good now that I significantly downsized my CRT collection. The two I kept have just been gathering dust in my closet.

5 Likes

6 Likes

Very nice! Is it your very own crt consumer, @DariusG?

If configured properly, they definitely do, with the exceptions that @Nesguy stated. They will always be different under the hood, being crts analog devices and flat screen discrete ones, but perceptually and convenience-ly, let alone sheer size, the former can’t really compete.

The poor things. Mine are in storage as well :_)

1 Like

Some shaders especially “fast” ones will stick to a very sharp image, since LCD is already sharp, they won’t do much to alter image to keep speed decent, and have that digital look like zfast-crt. While they do improve the raw LCD look, they won’t resemble a real CRT faithfully, if that was the target anyway.

You would need a heavier shader to actually worsen the image and make it look like a real CRT. Like crt-lottes, that’s how a typical crt looks more or less. Well probably a bit sharper than lottes, i think some shader creators remember the blurry composite and tried to recreate that too, e.g. crt-geom has those ringing artifacts that do exist in composite (at least in some TVs, do the use some window filter?) while being very sharp too. I think crt-pocket (silly name) i wrote, resembles a bit more how a real CRT looks like. Kept Lanczos there and removed it’s ringing, pixel shape is a good recreation how CRT pixels look like in RGB without that crt-geom “composite” ringing.

crt-lottes, close to how a CRT looks in composite bluriness, missing the NTSC artifacts and being too heavy.

crt-geom, closer to an extremely sharp RGB high quality monitor, still throwing that composite ringing upon you. That type of monitor probably didn’t ever exist too, curved with very high density Trinitron pixels.

crt-pocket, imo mixing both worlds better, sharper than lottes on crt-geom level (still using Lanczos), evading the ringing artifacts. Using some of lottes masks too.

5 Likes

Very good examples. I remember lottes was highly regarded during the time of early generation crt shaders, due to its quite impressive accuracy. Doesn’t that sound like nostalgia for old technology that replicates even older technology? Nostalgia^2

And your pocket looks fantastic :open_mouth:

3 Likes

That looks great. I’ve been using this screen as a sharpness test - both of Mario’s eyes should be “solid” black. Also the vertical lines, etc. Can it pass?

These are the settings I’m currently using for guest-advanced-ntsc, using an HDR1000 MiniLED with local dimming enabled.

For comparison’s sake

shaders = "19"
feedback_pass = "0"
shader0 = "shaders_slang/misc/shaders/grade-no-LUT.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "viewport"
scale_x0 = "1.000000"
scale_type_y0 = "viewport"
scale_y0 = "1.000000"
shader1 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
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/stock.slang"
alias2 = "StockPass"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
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/afterglow0.slang"
alias3 = "AfterglowPass"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "true"
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/pre-shaders-afterglow.slang"
alias4 = "PrePass0"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "true"
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/ntsc/ntsc-pass1.slang"
alias5 = "NPass1"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
filter_linear5 = "false"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "4.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.slang"
alias6 = ""
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "true"
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "0.500000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass3.slang"
alias7 = ""
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "true"
float_framebuffer7 = "false"
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/custom-fast-sharpen.slang"
alias8 = "NtscPass"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "true"
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/stock.slang"
alias9 = "PrePass"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
filter_linear9 = "true"
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/avg-lum-ntsc.slang"
alias10 = "AvgLumPass"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "true"
filter_linear10 = "true"
float_framebuffer10 = "false"
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/linearize-ntsc.slang"
alias11 = "LinearizePass"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
filter_linear11 = "true"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "source"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass1.slang"
alias12 = "Pass1"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
filter_linear12 = "true"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "viewport"
scale_x12 = "1.000000"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/hd/gaussian_horizontal.slang"
alias13 = ""
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
filter_linear13 = "true"
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "800"
scale_type_y13 = "source"
scale_y13 = "1.000000"
shader14 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias14 = "GlowPass"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
filter_linear14 = "true"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "800"
scale_type_y14 = "absolute"
scale_y14 = "600"
shader15 = "shaders_slang/crt/shaders/guest/hd/bloom_horizontal.slang"
alias15 = ""
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
filter_linear15 = "true"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "absolute"
scale_x15 = "800"
scale_type_y15 = "absolute"
scale_y15 = "600"
shader16 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
alias16 = "BloomPass"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
filter_linear16 = "true"
float_framebuffer16 = "true"
srgb_framebuffer16 = "false"
scale_type_x16 = "absolute"
scale_x16 = "800"
scale_type_y16 = "absolute"
scale_y16 = "600"
shader17 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass2.slang"
alias17 = ""
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
filter_linear17 = "true"
float_framebuffer17 = "true"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
shader18 = "shaders_slang/crt/shaders/guest/advanced/deconvergence-ntsc.slang"
alias18 = ""
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
filter_linear18 = "true"
float_framebuffer18 = "false"
srgb_framebuffer18 = "false"
scale_type_x18 = "viewport"
scale_x18 = "1.000000"
scale_type_y18 = "viewport"
scale_y18 = "1.000000"
g_CRT_l = "2.300000"
g_vibr = "1.000000"
wp_saturation = "1.200000"
cust_artifacting = "0.000000"
ntsc_taps = "6.000000"
ntsc_shape = "1.000000"
CCONTR = "0.000000"
CDETAILS = "0.000000"
NDEBLUR = "8.000000"
GAMMA_INPUT = "2.200000"
gamma_out = "2.200000"
interm = "5.000000"
HSHARPNESS = "1.400000"
SIGMA_HOR = "0.800001"
S_SHARP = "1.000000"
HSHARP = "2.000000"
MAXS = "0.300000"
HARNG = "0.200000"
m_glow = "2.000000"
glow = "0.050000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "2.000000"
scanline1 = "5.000000"
scanline2 = "40.000000"
beam_min = "1.200000"
beam_size = "0.000000"
scans = "1.500000"
shadowMask = "12.000000"
maskstr = "0.800000"
mcut = "1.000000"
deconrry = "1.000000"
deconrby = "-1.000000"
post_br = "1.500000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_mipmap = "false"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_mipmap = "false"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_mipmap = "false"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_mipmap = "false"
SamplerLUT4_wrap_mode = "clamp_to_border"
2 Likes

N64 over S-Video “PVM-style”

EDIT: these are a little blurry because the focus setting was set wrong.

4 Likes