CRT-Yah! A new shader chain

That’s nes/snes NTSC phase right there with diagonal lines. It’s already discussed many times before how rainbow is created and already implemented in other shaders, like e.g. crt-consumer-1w-XL i wrote or ntsc-blastem in “ntsc” folder.

1 Like

Thanks for checking it out, glad you like it.

I think the yellow tint comes from the “Brightness Overlow”, which increases the brightness beyond full saturation, e.g. a full saturated red become orange. Another factor could be the “Mask Color Bleed”, where bright subpixel bleed into neighbor subpixel and slightly change the overall hue if the whole pixel.

Can you confirm the yellow tint goes away when decreasing these two settings? Maybe I need to tinker around with the factors for each color channel, so that the overall hue is not changed too much.

1 Like

Ahh - it’s brightness overflow that is causing it. Reducing this down to zero gives almost exactly the same colours as the raw output.

Reducing Mask colour bleed actually makes it worse; increasing it gives brighter pixels with deeper saturation; removing the yellow tint a bit.

As an aside, I would throw my hat in the ‘sharper NTSC’ ring. Love the colours and the waterfall effects in Sonic but the rest is so blurry that my eyes can’t handle it! EDIT: A general sharpness scale or guidance on sharpness would be great actually - finding on consoles like PS1/2 where increasing scale helps with text legibility, there’s a bit of blur inherent in moving to +0.5 or +1.

All tests performed at 4k on an LG BX OLED; Vulkan in Bazzite (Linux)

Yeah at first I had issues with my hues too (particularly red being pushed to yellow indeed), until I figured out what overflow does. It’s another of those unique yah traits that you won’t find anywhere else. I generally would recommend a value of 0.5 for it.

2 Likes

Thanks, I’ll give that a try! Do you have a real set to compare Yah against? It’s far and away becoming my favourite, it’s so easy to get good results.

@Jezze would you be able to advise on what to prepend or append to Yah single-pass to add halation? I’m trying to keep resources under control but the halation is sorely missed in single-pass.

Thanks again, and a Merry Christmas/Happy Holidays to you all :slight_smile:

1 Like

My crts are currently in storage, the poor things. I just don’t need them anymore. This is why :slight_smile:

Regarding halation, adding it yourself is basically going to create a preset that is pretty much yah multipass minus ntsc. This is where halation comes from

shader5 = "shaders/crt-yah/blur-horizontal.slang"
filter_linear5 = true // required: sample lut-output linear

shader6 = "shaders/crt-yah/blur-vertical.slang"
filter_linear6 = true

It’s the same tried and true method that other shaders use, afaik. If your device is really struggling with the blur passes, try prepending Hyllian’s dilation (in the “warp” folder). It’s not the same but it might be faster.

You can also run the shader at lower resolutions, makes a big difference with older machines and still looks great. Try 1920x1080 (easy way out) and if that’s still a bit slow, 1280x960 and 1194x896 are nice 4:3 integer vertical multiples of 240 and 224 respectively.

3 Likes

What are the chances of a Reshade version of Yah? If I had any idea how to code I’d try it myself!

A new version is on the way addressing some of your feedback.

NTSC changes:

  • Renamed “Quality” parameter to “Chroma Phase” (“Field Merge” has been removed, see new “Jitter” parameter)
  • Added new “Chroma Shift” parameter, which enables the rainbow effect
    @ynnad4: use “Two-Phase” and set “Chroma Shift” to -1 or 1
  • Reduced blurriness by disabling the bi-linear texture filtering of the upscale pass. If you have created your own complex preset, you have to set filter_linear for ntsc-pass1 to false manually.
    @colourofsound: in addition you can set the “Beam Filter” parameter into the “Blocky” direction (e.g. -0.75) to get a sharper NTSC appearance
  • Added a new “Jitter” parameter, which let you disable the jitter effect. The old “Field Merge” setting of Three-Phase basically did that before, now you can do the same for Two-Phase as well.

Preset (crt/shaders/crt-yah/presets) changes:

  • Reduced Deconverge, Phosphor and Halation effect across all presets slightly
  • Adjusted Contrast and Brightness across all presets to be less dark
  • Added pure-NTSC preset
  • Added pure-Scanlines preset based on @Squalo’s configuration (not exactly the same, though)

Other changes:

  • Added new “Screen Frequency” parameter to select between 30 and 60 Hz affecting the speed of the NTSC and Scanline Jitter effects.

@colourofsound
Regarding a Reshade version of CRT-Yah, I have not looked into it yet. The chances of porting it myself depend on how much of the code I have to rewrite. :wink:

4 Likes

Epic work! Very excited about a potential Reshade port :wink:

NTSC is still a bit blurry for me it has to be said; but I’m not too bothered about using that setting.

Would you mind explaining the sub pixel settings? On my LG OLED setting 2 looks pretty good and it’d be good to understand why :slight_smile:

Not sure what else I could do to further reduce the blurriness of the NTSC effect. The recent changes should have eliminated the blurriness in the vertical (y) direction. But as for the horizontal (x) direction, I’d say that’s just the nature of the effect, esp. for the two-phase option.

Regarding the sub-pixel mask setting: 2-MG stands for magenta/green. So the sub-pixel mask consists of only two alternating colors instead of three as with RGB. This is actually nothing special; other shaders also offer this type of sub-pixel mask. Magenta/green usually appears more uniform, because the brightness between magenta and green is very similar, unlike the brightness between RGB.

However, a special feature of this shader compared to most others is the scaling of the sub-pixel mask based on the screen resolution. For example, at 1080p, the sub-pixel size is 1, while at 2160p (4K), the sub-pixel size is automatically scaled to 2.

Long story short, I don’t know why magenta/green works better for your LG OLED. The interaction of the actual sup-pixel grid of your display and the simulated sub-pixel mask can be quite complex and also can lead to artifacts, esp. with a sub-pixel size of 1.

3 Likes

I was hoping this would be common knowledge by now but LG 4K OLED TVs before the G5 use RWBG subpixel layout, therefore the only CRT Shader Subpixel Mask that would align properly and evenly is RRBBGGX (and possibly XRRBBGG but I haven’t tested that on any OLED TV). Regular RGB or BGR Subpixel Masks would not look accurate at least close up to the screen because of this.

This shader looks really good. Is there a way to turn off the flickering though?

You can turn off the scanlines jitter and also the jitter of the NTSC effect when activated:

  • set “Scanlines > Offset” to 0
  • set “NTSC > Jitter” to 0

There is also some animated noise you can disable:

  • set “CRT > Noise” to 0

Hi, great shader for starters! Actually it’s now by default shader I really like it. I have a question though. For 480p content what settings should I set in order to have a more convincing look?

Alt+Tabing and going back in gets rid of the flicker without adjusting any of those settings. Not sure what the issue is. Sorry, this is happening on other shaders too.

FYI : With the newest version i had to turn down saturation from 1.15 to 0.95 otherwhise I got black fragments in bright Letters on different cores and systems across the board. As soon as I went under1.00 they were gone

@Dante Depends on what you mean by convincing. Since you mention 480p, e.g. like Dreamcast or Naomi: This resolution is automatically down-scaled to 240p. You can return to 480p by setting the “Screen > Scale” to 1, or you try 360p by setting the value to 0.5.

@passballtotucker What video driver do you use? I usually go with Vulcan and rarely test the others.

@Buccaneer The shader code for saturation was actually not changed only the preset settings. Were you able to configure a saturation above 1.0 before? And what video driver do you use? I will test other than Vulcan, and try to reproduce this issue.

1 Like

I could not reproduce the issue with other video drivers. However, the saturation method I use could produce numeric errors, leading to NaN or Inf, which could be handled differently from hardware to hardware.

There might be a simple solution, which should prevent the potential numeric errors. Can you open the file crt\shaders\crt-yah\common\color-helper.h go to line 82 and replace:

    return saturation > 1.0
        // increase
        ? apply_scale(pow(color, vec3(saturation)), max_color(color))
        // decrease
        : mix(vec3(luminance), color, saturation);

by:

    return mix(vec3(luminance), color, saturation);

This does not give the exact same result as before, but is very close.

If that works for you, I will provide an updated version soon.

Tested and I can confirm with that code it works flawlessly with saturation above 1.0. PS I use vulkan and the saturation was above 1.0 since a long time…sttrangely with the latest version the problem came up. Thx

Hey great shader. I wish there was a way to control the NTSC Resolution or Resolution Scale because when I enabled NTSC things got way too blurry without any ability to fine tune it.

I tried loading my Blargg NTSC Video Filter presets but I got a black screen when attempting to load using Beetle PCE/SGX/CD. Apparently the NTSC Video Filter preset loading isn’t broken when using Beetle PCE Fast. This last part is for @hunterk, @Tatsuya79, and @barbudreadmon.

@Jezze On another note, besides the lack of WOLED specific subpixel mask layouts mentioned above, I sorely missed subpixel mask layouts for bgr displays, which is what I’m currently using for the most part but great work on a shader that makes it easy to keep things bright while remaining saturated and providing full opacity mask and scanline emulation and more!