CRT shader debate

@Nesguy

Here you go. It’s an alpha.

EDIT: I left the bloom stuff at default settings. The settings I’m using are Bloom: Bleed 3.5 higher less bleed for lower Bloom: Strength Numbers I’m using around Bloom: Strength 0.20 and I dropped Scanlines: Fade down to 0.65.

1 Like

My current settings:

After playing around with mask/backlight tricks for a while, I’ve concluded that non-HDR capable displays are incapable of maintaining sufficient peak brightness when both 1:1 scanlines and the RGB mask are applied, without adding a significant amount of bloom/fade to the scanlines. This is true even if the backlight is adjusted to 100%.

The problem is that when you add 1:1 scanlines and max out the mask strength, it’s something like a 70-80% reduction in brightness. So, you have to increase the backlight by 4x or 5x the normal level, and there isn’t enough spare brightness available to compensate on even the brightest LED-lit LCDs (that lack HDR).

To maintain adequate brightness, you have to either reduce the strength of the scanlines or the mask, or you have to add a lot of bloom/fade to the image, or you have to mess with the black level, contrast or color levels.

If the scanlines are much less below 1:1, if the image isn’t bright enough/too bright, if the image is too sharp, if the image is too blurry, if the scanlines are misaligned, if color/black level/contrast isn’t calibrated, if the image is too smooth (ie no mask)- then it isn’t optimal.

With the below settings, I’ve opted to lower the mask strength in order to have 1:1 scanlines. The mask strength can’t be increased further without either adding a lot of bloom or reducing the scanline strength in order to maintain brightness. I still have to adjust my backlight to 100% for these settings to look right.

alias0 = ""
alias1 = ""
alias2 = ""
BLURSCALEX = "0.300000"
BRIGHTBOOST = "1.000000"
DOTMASK_STRENGTH = "0.000000"
feedback_pass = "0"
filter_linear1 = "true"
filter_linear2 = "true"
float_framebuffer0 = "false"
float_framebuffer1 = "false"
float_framebuffer2 = "false"
HILUMSCAN = "8.000000"
ia_B = "1.000000"
ia_black_level = "0.000000"
ia_BOTMASK = "0.000000"
ia_bright_boost = "0.000000"
ia_contrast = "1.000000"
ia_FLIP_HORZ = "0.000000"
ia_FLIP_VERT = "0.000000"
ia_G = "1.000000"
ia_GRAIN_STR = "0.000000"
ia_LMASK = "0.000000"
ia_luminance = "1.000000"
ia_monitor_gamma = "2.200000"
ia_overscan_percent_x = "0.000000"
ia_overscan_percent_y = "0.000000"
ia_R = "1.000000"
ia_RMASK = "0.000000"
ia_saturation = "1.000000"
ia_SHARPEN = "0.000000"
ia_target_gamma = "2.400000"
ia_TOPMASK = "0.000000"
ia_XPOS = "0.000000"
ia_YPOS = "0.000000"
ia_ZOOM = "1.000000"
INTERPOLATE_IN_LINEAR_GAMMA = "1.000000"
LOWLUMSCAN = "9.000000"
MASK_DARK = "0.000000"
MASK_FADE = "0.000000"
maskDark = "0.700000"
maskLight = "1.400000"
mipmap_input0 = "false"
mipmap_input1 = "false"
mipmap_input2 = "false"
parameters = "INTERPOLATE_IN_LINEAR_GAMMA;ia_target_gamma;ia_monitor_gamma;ia_overscan_percent_x;ia_overscan_percent_y;ia_saturation;ia_contrast;ia_luminance;ia_black_level;ia_bright_boost;ia_R;ia_G;ia_B;ia_ZOOM;ia_XPOS;ia_YPOS;ia_TOPMASK;ia_BOTMASK;ia_LMASK;ia_RMASK;ia_GRAIN_STR;ia_SHARPEN;ia_FLIP_HORZ;ia_FLIP_VERT;BLURSCALEX;LOWLUMSCAN;HILUMSCAN;BRIGHTBOOST;MASK_DARK;MASK_FADE;shadowMask;DOTMASK_STRENGTH;maskDark;maskLight"
shader0 = "D:\retroarch\shaders\shaders_glsl\retro\shaders\pixellate.glsl"
shader1 = "D:\retroarch\shaders\shaders_glsl\misc\image-adjustment.glsl"
shader2 = "D:\retroarch\shaders\shaders_glsl\crt\shaders\zfast_crt+dotmask.glsl"
shaders = "3"
shadowMask = "3.000000"
srgb_framebuffer0 = "false"
srgb_framebuffer1 = "false"
srgb_framebuffer2 = "false"
wrap_mode0 = "clamp_to_border"
wrap_mode1 = "clamp_to_border"
wrap_mode2 = "clamp_to_border"

In the next example I’ve left the mask strength at the defaults, which makes the mask a bit stronger than in the above example. I had to then increase mask/scanline fade to 0.45 to compensate for the lost brightness. Both of these images are equally bright. I think I prefer the above image, with no bloom, but both are acceptable IMO.

EDIT: fixed screenshots.

4 Likes

I think those are the same image

haha, yeah they are. Having trouble with shader settings sticking when I take screenshots… It’s weird.

EDIT: think I was just forgetting to apply settings or something. Anyway, it’s fixed now. :sweat_smile:

1 Like

Away from the PC currently, what are using pixelate for in you shader chain?

It’s not really doing anything in that particular image, but I have it as part of the shader chain for when I play PSX games. PSX games can switch resolutions mid-game, so you get scaling artifacts no matter what you set the aspect ratio to. Pixellate fixes the scaling artifacts that occur with non-integer scaling.

check out the images in this post for an example of what I’m talking about.

1 Like

Nice image. Not from a gdm fw900 though. I outa know as I took the image. It’s from a dell ultrascan p991 running at 120hz@240p. Using RetroTINK-ULTIMATE with vga out.

Here, have some more images:

More images can be taken if wanted.

5 Likes

These look really nice! Is this an LCD? The second picture clearly looks like an LCD, but the other two have to be a CRT!

That’s just me having a hard time focusing with my phones camera… Or maybe it is an LCD. I’m experimenting with shaders at the same time on my LCD so it might be from there.

1 Like

Thanks for the pics! The quality of those Dell aperture grille CRTs is really amazing. The scanlines are so consistent that you can only really tell that it’s a CRT and not an LCD by getting so close that you can see the mask.

That’s more or less what I consider “ideal” for displaying 240p content, and is the look I’ve been trying to recreate with shaders.

The biggest problem I’ve encountered is that current LCDs just can’t get bright enough to compensate for both scanlines AND the mask. That’s why shaders try to compensate by adding glow and bloom effects and jacking with color and brightness levels, which compromises the image quality in other ways.

Anyway, here is my attempt to recreate the close up of Mario using shaders. This is just zfast_CRT with a few adjustments, pretty simple stuff. It’s not quite as sharp as the CRT and the scanlines aren’t quite as bold, but it’s pretty close.

It occurs to me that if one is trying to recreate the look of a high TVL CRT using shaders, it’s better to have NO mask at 1080p; the mask/aperture grille on a 1000 line CRT is practically as fine as the LCD grid on a 1080p display.

4 Likes

I’d definitely like to see more. It’d be nice to see some shots from different distances, too. I imagine the mask completely vanishes at anything close to a normal viewing distance?

Have you found a shader setup that is satisfactory to you? If so, please share!

Here you go. Some closeups and a few zoomed. Images from zelda is with a generic 720p overlay at 720p. There are no scanlines without it if you don’t look really close.

The overlay i use is found here: https://mega.nz/#!3kVG1I5J!G7vlvHMCh-4DReRVQI9bD5jFCZpj4tYEp181Bxa8D2w

Found it in this thread:

Here is from my LCD

I’m using crt-royale-kurozumi and crt-royale-xm29. Those are slang shaders that need you to use Vulkan as video driver.

But do share those zfast_crt settings. Looks grate.

3 Likes

It looks like the 720p overlay isn’t quite lining up with the pixels in your first shot (that’s the problem with overlays, they can be tricky to use), but this shot does a good job of illustrating just how close to an LCD a high quality CRT can get. Personally, I find the image on an LCD to be overly sharp, so I like to add a very slight amount of blur. You can also sometimes lower a monitor’s sharpness setting to get the same effect.

Here are the zfast_crt settings I’m using in the above close up of Mario:

shader #0: zfast_crt

shader #0 filter: linear

shader #0 scale: don’t care

alias0 = ""
BLURSCALEX = "0.300000"
BRIGHTBOOST = "1.000000"
feedback_pass = "0"
filter_linear0 = "true"
float_framebuffer0 = "false"
HILUMSCAN = "8.000000"
LOWLUMSCAN = "9.000000"
MASK_DARK = "0.000000"
MASK_FADE = "0.000000"
mipmap_input0 = "false"
parameters = "BLURSCALEX;LOWLUMSCAN;HILUMSCAN;BRIGHTBOOST;MASK_DARK;MASK_FADE"
shader0 = "D:\retroarch\shaders\shaders_glsl\crt\shaders\zfast_crt.glsl"
shaders = "1"
srgb_framebuffer0 = "false"
wrap_mode0 = "clamp_to_border"

I’ve also adjusted my LCD’s backlight to 100% to compensate for the lost brightness from scanlines.

@Nesguy, don’t you like to use the ntsc shader + crt shader?

I haven’t been using the ntsc-colors shader. On my display, ntsc-colors causes the colors to become over-saturated and results in clipping, particularly with red. If your display is already at maximum contrast, then any increase in color intensity is just going to result in clipping.

Right now all I’m using is Zfast_CRT for all systems. With PSX cores I’ve also added Pixellate to take care of scaling artifacts.

Currently, I think it’s best to forego use of the RGB mask so that I can do black frame insertion and 1:1 scanlines. With my LCD’s backlight maxed out, the resulting picture is just bright enough. As far as I’m concerned, there’s not much room for improvement without getting a better display than the one I currently have.

2 Likes

Pardon my intrusion on this thread. I want to know if there is a crt shader that would look like a Sony 32fv310 tv. I saw a video on youtube and 2d retro games look beautiful. Here is the link of the video if someone is interested in creating a shader that looks just like it.

Super Mario World on Sony 32fv310

1 Like

I think many of them look pretty similar to that. Try crt-aperture or crt-guest-dr-venom.

1 Like

Maybe try the Kurozumi presets I think there’s one for crt-guest-dr-venom and one crt-royale, also as hunterk said crt-apeture is a good choice as well.

I tried Kurozumi shader but for some reason it looks a little green.

I tried most of them but they look good when the characters are still but when you move around the scanlines and shadow mask fades a little.