Please show off what crt shaders can do!

So I’m planning on doing a build log for my fightstick and a buyer’s guide for arcade stick parts.

I’m wanting to gauge how much interest you guys would have in me actually doing this. (As the buyer’s guide will be fairly time consuming tbh)

2 Likes

I’ll check it out for sure, but writing stuff like that is like dancing: you gotta do it like nobody’s watching (er, reading) or it’s no fun. Do it for you, bro.

2 Likes

May hit you up when I’m writing the buyers guide, as my Japanese lever knowledge is meh. I can write you a small book about Korean levers, buttons and switches though XD.

2 Likes

I’d like to share some screenshots based on a preset I’ve been using recently. What I’m trying to achieve is to mimic how the old-school games looked on good consumer crt, according to “my memory”. Probably a Sony Trinitron like this one: https://www.youtube.com/watch?v=sNLWjgpxSO8 But memory is the keyword here. How we remember things are often somewhat different from how they really were. For example, I don’t remember the sprites being super rough/pixelated/blocky back in the day and obviously my memory serves me wrong. I also never felt the picture being blurry when I was playing those 8-bit/16-bit games on a crt. (maybe soft, but not blurry) But the fact is that consumer-crts do look a bit blurry especially when we are now getting used to FHD/UHD sharpness. In short, I tried not to replicate the crt characteristics that do not exist in my memory.

Some details: This is based on the crt-royale preset. Integer scale isn’t required. I tried to minimize the uneven scanlines and I think the results are decent enough (on par with the default settings of most crt shaders in terms of even scanlines when using non-integer scale). I also tried to make the scanlines/masks look more subtle on brighter pixels than they should. So instead of prominent, strong/thick scanlines, there are now subtle textures covering these brighter parts of the picture. I used to hate this but when I exaggerated the effect a little bit more than the default value, it started to grow on me. It helps generate a much more natural “glowing effect” for things like lightning, fireballs, explosions, magic, etc. A real crt manifests this behavior as well but not nearly as much. By exaggerating the effect, the image immediately looks more convincing IMHO. (more in line with what “my memory” tells me about how CRTs should look like)

I think casual users (who don’t care about things like 100% color accuracy, true crt characteristics, etc) will like the look of this preset for its “seeming faithfulness” to CRTs if they haven’t seen a real crt for a long time, and find these screenshots pretty. Please view them on a 1080P display in fullscreen mode without any scaling. If you notice any strange patterns or artifacts, you can also try 2x or 3x zoom. I know you guys know CRT a lot better than I do, but if any of you like the setting or the idea, or want to help improve it, I’d be happy to share it.

Just noticed that I can only upload one screenshot in a post because I’m a new user : (

8 Likes

My old TV 1366*768 resolution with crt-easymode. Not bad

1 Like

@crtJoe Thanks for sharing, I think it looks quite nice and I see where you’re coming from with what you’re trying to achieve. My experience is that a lot of shaders can look very nice in a screenshot, it’s as if “someone took a photo of a real CRT”. Yours may fall in the same category. But once you start playing games with the shader for an hour or longer it just doesn’t hold up. As you already mentioned real CRTs are much more subdued than what people recall from playing a CRT at night, half in the dark.

I’m curious if when you have had a few longer playing sessions (an hour or longer) really playing games with your preset, whether or not it actually holds up for you, and it doesn’t eyestrain you or “irritate” you in another way (the urge to start tweaking parameters again etc…) .

Please let us know and share the preset if it does :slight_smile: :+1:

.

P.S. a nice alternative to Royale is the guest-dr-venom shader, works quite nicely out of the box. You may want to give that a go also to see how they compare

https://forums.libretro.com/t/new-crt-shader-from-guest/25444/270

2 Likes

Thank you very much for the kind feedback. Actually, crt-guest-dr-venom was my go-to shader. I did get very good results with it by making the scanlines/mask strength as strong and as pronounced as possible. It looks exactly like a PMV to me:

The problem is that

  1. I don’t emotionally attached to the PVM look. Never had one so zero nostalgia there. T

  2. As far as I know, the author is still working on/improving the shader. This is supposed to be good news and we should be very grateful. But the last time (probably some time during last year) he released a major update, he improved a lot of the original settings and added some new things. It took me hours to tweak the new settings and make it look like my old setting, which I probably already spent weeks to work on. It was a painful experience. I’ll definitely start using it again when everything is finalized or when I know I don’t have to re-work on my settings after an update.

  3. Integer scale is needed for my setting for guest-dr-venom, if I don’t want to moderately compromise the look.

That’s why I went back to crt-royale. I know what you meant about static photos vs a real crt in action. But IMHO it looks more authentic, according to my unreliable memory obviously, than a bunch of presets I’ve tried. I think I probably “only” need a 120hz 4K monitor to make it look like a real deal (again like how I remember it, not necessarily a true crt) because I really want to use slot mask instead of aperture grille, and enable black frame insertion. Probably a piece of real glass would also help :stuck_out_tongue:

If you are curious about how the preset performs with different games, you can download more screenshots here:

https://drive.google.com/file/d/1RyHhgkW2FxonwAPfvZbjUDn_RBsUsm-f/view?usp=sharing

I think some of my settings will be immediately frowned upon LOL. I’ll post them later.

2 Likes

Current settings for the new version of guest-dr-venom. I really like what I’m seeing in terms of mask definition and brightness. This is without grade; I got it working again but have been too lazy to make a new preset.

shaders = "6"
shader0 = "shaders_slang/crt/shaders/guest/crt-gdv-new/afterglow0.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "AfterglowPass"
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/crt-gdv-new/pre-shaders-afterglow.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "LinearizePass"
float_framebuffer1 = "true"
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/crt-gdv-new/avg-lum.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "true"
alias2 = "AvgLumPass"
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/crt-gdv-new/blur_horiz2.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = ""
float_framebuffer3 = "true"
srgb_framebuffer3 = "false"
scale_type_x3 = "absolute"
scale_x3 = "800"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/guest/crt-gdv-new/blur_vert2.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "GlowPass"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "absolute"
scale_x4 = "800"
scale_type_y4 = "absolute"
scale_y4 = "600"
shader5 = "shaders_slang/crt/shaders/guest/crt-gdv-new/crt-guest-dr-venom2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "viewport"
scale_x5 = "1.000000"
scale_type_y5 = "viewport"
scale_y5 = "1.000000"
parameters = "PR;PG;PB;AS;sat;TNTC;CP;CS;WP;wp_saturation;GAMMA_INPUT;lsmooth;SIZEH;GLOW_FALLOFF_H;SIZEV;GLOW_FALLOFF_V;glow;bloom;TATE;IOS;OS;BLOOM;gamma_c;brightboost;brightboost1;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;vertmask;scans;spike;h_sharp;s_sharp;csize;bsize;warpX;warpY;shadowMask;masksize;maskDark;maskLight;CGWG;mcut;slotmask;slotwidth;double_slot;slotms;mclip;inter;interm;gamma_out"
PR = "0.170000"
PG = "0.170000"
PB = "0.170000"
AS = "0.070000"
sat = "0.100000"
TNTC = "0.000000"
CP = "0.000000"
CS = "0.000000"
WP = "-50.000000"
wp_saturation = "1.000000"
GAMMA_INPUT = "2.400000"
lsmooth = "0.900000"
SIZEH = "4.000000"
GLOW_FALLOFF_H = "0.300000"
SIZEV = "4.000000"
GLOW_FALLOFF_V = "0.300000"
glow = "0.010000"
bloom = "0.000000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
gamma_c = "1.000000"
brightboost = "1.000000"
brightboost1 = "1.500000"
gsl = "0.000000"
scanline1 = "5.000000"
scanline2 = "20.000000"
beam_min = "2.000000"
beam_max = "1.000000"
beam_size = "1.000000"
vertmask = "0.000000"
scans = "0.500000"
spike = "0.000000"
h_sharp = "3.000001"
s_sharp = "1.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
shadowMask = "2.000000"
masksize = "1.000000"
maskDark = "0.500000"
maskLight = "1.000000"
CGWG = "0.300000"
mcut = "1.150000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
slotms = "1.000000"
mclip = "0.400000"
inter = "350.000000"
interm = "1.000000"
gamma_out = "2.200000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron1.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron2.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/lut/other1.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
3 Likes

I think the only real way to judge settings is by using Fudoh’s 240p Test Suite and a variety of games. It’s important when using games to calibrate that you only use things from the same region, gamma and color temp varied by the standard used (PAL, NTSC, NTSC-J) so you should wind up with 3 different presets. Even then, some developers made weird choices and you may find that you want to do some color correcting of your own.

A 20" TV from the 1980s had probably 2 phosphor triads per scanline. At 8x (vertical) scale we can use this pattern to get a pretty good approximation of a slotmask.

image

I think this is the best pattern to use; the magenta/green one really over-represents the crossbars.

You’ll want to get a display with very high SDR brightness (1000 nits) to do black frame insertion + scanlines + phosphor emulation. AFAIK only the Samsung QLEDs are capable of that, and they also have the specs for gaming (input lag, refresh rates, etc). They’re not perfect, though, and I’m really hoping that dual-layer LCD or microLED is commercialized eventually. I would also strongly recommend avoiding a matte screen, it really puts a damper on CRT emulation IMO.

1 Like

I stopped being lazy and added grade.

shaders = "7"
shader0 = "shaders_slang/misc/grade.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/crt-gdv-new/afterglow0.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "AfterglowPass"
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/crt-gdv-new/pre-shaders-afterglow.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "LinearizePass"
float_framebuffer2 = "true"
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/crt-gdv-new/avg-lum.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "AvgLumPass"
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/crt-gdv-new/blur_horiz2.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = ""
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "absolute"
scale_x4 = "800"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/crt-gdv-new/blur_vert2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "GlowPass"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "absolute"
scale_x5 = "800"
scale_type_y5 = "absolute"
scale_y5 = "600"
shader6 = "shaders_slang/crt/shaders/guest/crt-gdv-new/crt-guest-dr-venom2.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "viewport"
scale_x6 = "1.000000"
scale_type_y6 = "viewport"
scale_y6 = "1.000000"
parameters = "PR;PG;PB;AS;sat;TNTC;CP;CS;WP;wp_saturation;GAMMA_INPUT;lsmooth;SIZEH;GLOW_FALLOFF_H;SIZEV;GLOW_FALLOFF_V;glow;bloom;TATE;IOS;OS;BLOOM;gamma_c;brightboost;brightboost1;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;vertmask;scans;spike;h_sharp;s_sharp;csize;bsize;warpX;warpY;shadowMask;masksize;maskDark;maskLight;CGWG;mcut;slotmask;slotwidth;double_slot;slotms;mclip;inter;interm;gamma_out"
PR = "0.170000"
PG = "0.170000"
PB = "0.170000"
AS = "0.070000"
sat = "0.100000"
TNTC = "0.000000"
CP = "0.000000"
CS = "0.000000"
WP = "-50.000000"
wp_saturation = "1.000000"
GAMMA_INPUT = "2.400000"
lsmooth = "0.900000"
SIZEH = "4.000000"
GLOW_FALLOFF_H = "0.300000"
SIZEV = "4.000000"
GLOW_FALLOFF_V = "0.300000"
glow = "0.010000"
bloom = "0.000000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
gamma_c = "1.000000"
brightboost = "1.000000"
brightboost1 = "1.500000"
gsl = "0.000000"
scanline1 = "5.000000"
scanline2 = "20.000000"
beam_min = "2.000000"
beam_max = "1.000000"
beam_size = "1.000000"
vertmask = "0.000000"
scans = "0.500000"
spike = "0.000000"
h_sharp = "3.000001"
s_sharp = "1.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
shadowMask = "2.000000"
masksize = "1.000000"
maskDark = "0.500000"
maskLight = "1.000000"
CGWG = "0.300000"
mcut = "1.150000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
slotms = "1.000000"
mclip = "0.400000"
inter = "350.000000"
interm = "1.000000"
gamma_out = "2.200000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron1.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron2.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/lut/other1.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
1 Like

I was testing the shadow masks from lottes shader (pasted on crt-hyllian) on my PS3 Retroarch on a Plasma TV and I have a question:

Is it normal that the ShadowMask number 2 (the Aperture Grill one) has the reds a bit saturated? I think my screen became too much red overall.

Anyway, here’s the crt-hyllian I was testing: crt-hyllian with lottes shadowmasks

Lottes shader run too slow on PS3, so I’m pasting its shadowmasks to my crt-hyllian. It runs fullspeed.

2 Likes

Yes, I think all of the Lottes masks do something to the colors due to chromatic aberration/uneven subpixel spacing.

A red/blue/green/black pattern should solve this, or the magenta/green pattern.

1 Like

Oh, I see. Which other shader with balanced aperture grill masks do you recommend that I could try porting to crt-hyllian? I’m not an expert in shadow masks, so I need to borrow free code, kkk.

2 Likes

This might have what you’re looking for:

At 1080p though you’re limited to the two options just described.

1 Like

@Hyllian

Btw that is one shady file hosting site you used, lol. I can’t even copy&paste the text before the popups get me.

Edit: you should also consider adding grade, the color temp adjustment is very useful for correcting any weird tint from masks.

Really? I have no problem using it. If you want, I can paste the shader here.

Thanks, I just ported that to Cg and it worked flawlessly.

Do you know why some of the layouts produce moire and others not?

For the first param “vec2 coord” I’m passing this:

texCoord.xy*(texture_size.xy/video_size.xy)*output_size.xy

As I’m used to use it in cg shaders. Maybe hunterk can confirm if that’s correct.

From my experience, moire is happening because dark colors/patterns.

Usually I can mitigate moire at the cost of decreased scanline strength and/or lowering the mask strength.

1 Like

Lowering strengh reduce moire, indeed. Thanks.

1 Like

Moire is caused when the mask pattern used is x pixels in height, where x is greater than 1 and is not a factor of y, with y being the vertical scale. So e.g., 5x vertical scale with a pattern that is 2 pixels tall will produce moire.

Curvature also produces moire.

Other than that, not using integer scale will produce moire.

These are all the sources of moire in shaders afaik.

Can you get a slang version up when you get a chance? Curious to see what you’ve been working on.

2 Likes