PlainOldPants's Shader Presets

thanks

no problem if it not 100% accurate at start, since we dont have any shader that did that effect yet (so having something is better than nothing), and later if we got more info about it we can correct it or make another version of it

3 Likes

https://www.mediafire.com/file/qgnzkcqwsi30l4n/p68k-fast-multipass-2025-11-04.zip/file

This is a total rush job, but it adds an RF noise effect and just slightly improves the adaptive comb filter.

The noise settings will behave slightly differently depending on which .slangp you pick because they use different discrete sampling rates.

Edit: I don’t know why the comb filter is causing the noise to disappear.

Edit 2: The “Adaptive+Notch” option is unfinished and basically doesn’t work at all.

3 Likes

https://www.mediafire.com/file/5msnokq2fhxtohw/p68k-fast-multipass-2025-11-05.zip/file

This one adds HDR support and real CRT colors. The code for it is also a duct-tapey mess like with the RF noise effect.

I can’t tell for sure whether it works or not. I don’t have an HDR monitor.

If you’re using the signal shader on its own, you should set “HDR mode” to Solo. If you’re appending a CRT shader onto it, set “HDR mode” to Appendable, and append p68k-append-hdr after the CRT shader.

The Toshiba Blackstripe CF2005’s blue primary is well outside of Display P3, so colors near blue and cyan won’t look correct for this CRT. The KV-27S22 in US mode is a similar enough alternative.

Edit: This version also fixed the issue where the noise would disappear while using the comb filter.

Edit 2: Actually, the problem with the Toshiba CF2005 is worse than I thought. If you want to append with a CRT shader, you can’t use the CF2005 at all unless your display is able to display its blue primary exactly correctly. Also unfortunately, I think the Panasonic from 2000 might also be just slightly off for this same reason, but thankfully, the Panasonic blue primary is only just slightly out of bounds, not as bad as Toshiba. I recommend using the Sony US mode instead of Toshiba, and using “Video decoder/region” = 2 instead of Panasonic.

3 Likes

I’m not sure it’s working as intended, I’m getting a washed out image. Can anyone else test @Cyber?

1 Like

This might either be correct or wrong behavior.

To use it with a CRT shader, you have to put the p68k-fast-mp preset before the CRT shader, and put the p68k-append shader after the CRT shader. Then, you have to set your settings like this:

The correct result absolutely should be less saturated than normal HDR video because it’s simulating the CRT’s RGB primaries, which aren’t as deep as HDR. It’s mostly close to sRGB, but not exactly there.

If you use this with a CRT shader, and you accidentally use “Solo” instead of “Appendable”, then that’ll cause the colors to become very washed out because it’s doing the HDR correction twice. On the other hand, if you use it without a CRT shader but forget to use the “Solo” mode, you’ll get an overly deep image instead.

In the correct result, the only colors that’ll be deeper than normal sRGB (SDR) are Sony’s green, Panasonic’s red, and, if you’re lucky to have a display that supports this, Toshiba’s blue. Other than this, you’ll just have some colors that are only physically possible to display in HDR, but they won’t necessarily be that vibrant. In fact, the Sony and RCA ones have less deep reds than normal SDR video.

My main purpose of adding support for this was to avoid gamut compression headaches that degrade the image quality whenever you try to display CRT colors on sRGB displays. I could make a shader that displays standard NTSC colors that are further out in HDR space, but I don’t see much of a purpose in that because it didn’t exist at the time, except maybe in some expensive proof-of-concept displays or something like a laser projector thingy.

1 Like

Did you use it with a Scanline/Mask Shader?

What am I supposed to be testing?

I’m getting Failed to Apply everytime I try to load or apprnd one of these:

p68k-fast-mp-170m-240p-combfilter-noise.slangp

p68k-fast-mp-170m-240p.slangp

Some of the passes are loading though.

On D3D11 I was getting a D3D Compilation error along with some info about some loop.

On Vulkan, I haven’t seen any error in the log but it still Failed to load. I extracted the folder to the Shaders_Slang/p68k-fast-multipass-2025-11-05 Folder.

I did load:

ntsc-colors-crt.slangp

…switch it to Append Mode.

Then load this:

p68k-append-hdr.slangp

Without Scanlines/Mask, These settings looked good to me.

shaders = "3"
feedback_pass = "0"
shader0 = "shaders_slang/p68k-fast-multipass-2025-11-05/p68k-fast-mp-pre-color-only.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
frame_count_mod0 = "2"
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/p68k-fast-multipass-2025-11-05/p68k-fast-mp-post-color-only.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
frame_count_mod1 = "2"
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/p68k-fast-multipass-2025-11-05/p68k-fast-mp-append-hdr.slang"
alias2 = ""
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
frame_count_mod2 = "2"
float_framebuffer2 = "true"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
pf_srgb_eotf = "2.000000"
pf_videostd = "19.000000"
pf_hdr_enable = "2.000000"
pf_hdr_gamut = "2.000000"
pf_hdr_crt = "2.000000"

2 Likes

I thought this was just a glitch with ShaderGlass, not with other RetroArch versions and/or GPU drivers too. The fix is to hard-code all the for-loops to end at some maximum number of iterations so that the compiler can unroll them cleanly. I’ve gone ahead and done that now. I’ve also added in another fix to make the comb filter work in ShaderGlass, since it looks like ShaderGlass requires all passes to reference each other in sequential order without history or feedback.

I had also forgotten to linearize when correcting the colors for HDR. That’s also fixed in this version.

Let me know if this version works for you now. The previous one loads fine for me on RetroArch on Ubuntu, but whenever I feel like trying stuff with ShaderGlass on Windows, I have to do random fixes like this to make it compile. Hopefully these same fixes work on your end.

https://www.mediafire.com/file/l43j0u58sg506cn/p68k-fast-multipass-2025-11-05-fix1.zip/file

2 Likes

Here’s my test version with guest-advanced. It’s not looking right, what am I doing wrong?

shaders = "19"
feedback_pass = "0"
shader0 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-pre-color-interlace-170m.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
frame_count_mod0 = "4"
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-encode-170m.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
frame_count_mod1 = "4"
float_framebuffer1 = "true"
srgb_framebuffer1 = "false"
scale_type_x1 = "absolute"
scale_x1 = "640"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-decode.slang"
alias2 = ""
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
frame_count_mod2 = "4"
float_framebuffer2 = "true"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-comb.slang"
alias3 = ""
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "false"
frame_count_mod3 = "4"
float_framebuffer3 = "true"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-post-color-deinterlace.slang"
alias4 = ""
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "false"
frame_count_mod4 = "4"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-deinterlace-merge.slang"
alias5 = ""
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
filter_linear5 = "false"
frame_count_mod5 = "4"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias6 = ""
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "false"
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias7 = "StockPass"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "false"
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/afterglow0.slang"
alias8 = "AfterglowPass"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "false"
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/pre-shaders-afterglow.slang"
alias9 = "PrePass"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
filter_linear9 = "false"
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.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.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/gaussian_horizontal.slang"
alias12 = ""
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
filter_linear12 = "true"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "absolute"
scale_x12 = "800"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias13 = "GlowPass"
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 = "absolute"
scale_y13 = "600"
shader14 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
alias14 = ""
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/advanced/bloom_vertical.slang"
alias15 = "BloomPass"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
filter_linear15 = "true"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "source"
scale_x15 = "1.000000"
scale_type_y15 = "source"
scale_y15 = "1.000000"
shader16 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced.slang"
alias16 = ""
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
filter_linear16 = "true"
float_framebuffer16 = "true"
srgb_framebuffer16 = "false"
scale_type_x16 = "viewport"
scale_x16 = "1.000000"
scale_type_y16 = "viewport"
scale_y16 = "1.000000"
shader17 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
alias17 = ""
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
filter_linear17 = "true"
float_framebuffer17 = "false"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
shader18 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-append-hdr.slang"
alias18 = ""
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
filter_linear18 = "false"
frame_count_mod18 = "2"
float_framebuffer18 = "true"
srgb_framebuffer18 = "false"
scale_type_x18 = "source"
scale_x18 = "1.000000"
scale_type_y18 = "source"
scale_y18 = "1.000000"
pf_hdr_enable = "2.000000"
bogus_afterglow = "1.000000"
wp_saturation = "1.200000"
gamma_out = "2.200000"
m_glow = "2.000000"
glow = "0.050000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "1.000000"
scanline1 = "5.000000"
scanline2 = "40.000000"
beam_min = "1.150000"
beam_max = "1.150000"
beam_size = "0.000000"
scans = "1.000000"
h_sharp = "5.999999"
s_sharp = "1.000000"
shadowMask = "12.000000"
maskstr = "0.700000"
mcut = "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"

Does this refer to something more specific than a CRT shader with scanlines and a mask?

2 Likes

No, I meant any normal CRT-Shader that doesn’t include NTSC signal emulation of course.

Why don’t you try it without the CRT-Shader and Comb Filter and see how it looks first. After that you can try adding the CRT-Shader (aka Scanlines/Mask shader) in between the NTSC Colors Shader and HDR (Decoder?) Shader.

1 Like

Even using that exact same preset, I can’t get it to look that bad on my laptop. Maybe it’s another one of those OS-dependent/driver-dependent problems, which are harder to discover and fix.

Or maybe you have some other setting on your PC or monitor that is correcting sRGB color into Display P3 color. I think that’s more likely to be the cause of the problem.

2 Likes

I’m leaning toward it being a driver/OS thing, I’ll see if I can isolate the problem later. I’m using an Nvidia 3090 Ti with the latest driver, Windows 11

I tried disabling “automatic color management” in Windows, but that didn’t solve it.

Try using it without the CRT shader, and tell me what happens. I need to have some clue as to what part of my code is OS/driver-dependent.

1 Like
shaders = "7"
feedback_pass = "0"
shader0 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-pre-color-interlace-170m.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
frame_count_mod0 = "4"
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-encode-170m.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
frame_count_mod1 = "4"
float_framebuffer1 = "true"
srgb_framebuffer1 = "false"
scale_type_x1 = "absolute"
scale_x1 = "640"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-decode.slang"
alias2 = ""
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "false"
frame_count_mod2 = "4"
float_framebuffer2 = "true"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-comb.slang"
alias3 = ""
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "false"
frame_count_mod3 = "4"
float_framebuffer3 = "true"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-post-color-deinterlace.slang"
alias4 = ""
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "false"
frame_count_mod4 = "4"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-deinterlace-merge.slang"
alias5 = ""
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
filter_linear5 = "false"
frame_count_mod5 = "4"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "p68k-fast-multipass-2025-11-05-fix1/p68k-fast-mp-append-hdr.slang"
alias6 = ""
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "false"
frame_count_mod6 = "2"
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
pf_hdr_enable = "2.000000"

Try this preset as you seem to be still loading the Comb Filter Preset:

1 Like

Let’s hope this fixes it. https://www.mediafire.com/file/wd4sk2ogvx1tgrw/p68k-fast-multipass-2025-11-07.zip/file

One part of the new CRT emulation code was modifying a mat3 like an array of 3 vec3s in column-major order. I’ve changed it to modify each individual float separately. I’m not 100% expecting this to work, but it’s worth a try.


Edit:

I thought I might clear this up. What I’m doing right now is still a compromise. What this prepend/append setup does is pass the CRT’s native RGB with a D65 white balance into the CRT shader, and then correct into any HDR (more precisely, wide gamut) color space in the final appended pass. The results depend on what CRT shader you pick, but in general, this means we’re preferring better individual RGB phosphor sizes, with some expense in scanline thickness and glow levels.

This brings me back to my “hunch” up here. For context, this earlier post was about simulating an effect where overdriven electron guns cause colors to bleed to the right.

Screenshot from 2025-11-07 22-36-39

This is a paper that I came across while aimlessly searching the web. I don’t remember what I was trying to do or how exactly I found it.

My interpretation here is that a pure D65 white doesn’t have all 3 phosphors at the same size, and that the maximum scanline thickness is different for each primary. I don’t know for certain whether current CRT shaders account for this or not, but I’m inclined to assume they all skip this. They might be accounting for individual RGB luminance weights somehow, or they might not be. I’ll need to check the code. This seriously matters for how I’ll go about combining my video signal shaders with other CRT shaders, or how I’ll possibly make my own CRT shader if it comes to that.

These different current ratios also determine how bright each primary can get before bleeding to the right. That’s the “hunch” that I had earlier. The problem is that I don’t have data for this for any of these CRTs. The best guess I have right now is the numbers from this paper which don’t have any citation.

“Ref 7” took me forever to find, and when I did find it on some obscure italian file sharing website, it turned out to be mostly useless, except for knowing that greens with a higher x-coordinate have higher brightness for the same amount of current. Here’s the link, if anyone is curious: https://it.annas-archive.org/md5/697568291741cabaf722948f4c80da25

https://www.youtube.com/watch?v=SfFi7_oykzY

3 Likes

This time I used the “ntsc-colors-crt” preset, same result:

shaders = "15"
feedback_pass = "0"
shader0 = "shaders_slang/p68k-fast-multipass-2025-11-07/p68k-fast-mp-pre-color-only.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
frame_count_mod0 = "2"
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/p68k-fast-multipass-2025-11-07/p68k-fast-mp-post-color-only.slang"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
frame_count_mod1 = "2"
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/advanced/stock.slang"
alias2 = ""
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/stock.slang"
alias3 = "StockPass"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "false"
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/afterglow0.slang"
alias4 = "AfterglowPass"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "false"
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/pre-shaders-afterglow.slang"
alias5 = "PrePass"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "true"
filter_linear5 = "false"
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/avg-lum.slang"
alias6 = "AvgLumPass"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "true"
filter_linear6 = "true"
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/linearize.slang"
alias7 = "LinearizePass"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "true"
float_framebuffer7 = "true"
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/gaussian_horizontal.slang"
alias8 = ""
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "true"
float_framebuffer8 = "true"
srgb_framebuffer8 = "false"
scale_type_x8 = "absolute"
scale_x8 = "800"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias9 = "GlowPass"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
filter_linear9 = "true"
float_framebuffer9 = "true"
srgb_framebuffer9 = "false"
scale_type_x9 = "absolute"
scale_x9 = "800"
scale_type_y9 = "absolute"
scale_y9 = "600"
shader10 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
alias10 = ""
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
filter_linear10 = "true"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "absolute"
scale_x10 = "800"
scale_type_y10 = "absolute"
scale_y10 = "600"
shader11 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
alias11 = "BloomPass"
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.slang"
alias12 = ""
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 = "viewport"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
alias13 = ""
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
filter_linear13 = "true"
float_framebuffer13 = "false"
srgb_framebuffer13 = "false"
scale_type_x13 = "viewport"
scale_x13 = "1.000000"
scale_type_y13 = "viewport"
scale_y13 = "1.000000"
shader14 = "shaders_slang/p68k-fast-multipass-2025-11-07/p68k-fast-mp-append-hdr.slang"
alias14 = ""
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
filter_linear14 = "false"
frame_count_mod14 = "2"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "source"
scale_x14 = "1.000000"
scale_type_y14 = "source"
scale_y14 = "1.000000"
pf_hdr_enable = "2.000000"
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"
1 Like

There are some aspects of CRTs where things just fall together and still work despite apparent nonlinearities like this.

It’s true that the spot size ends up different for different colors, macro photographs verify it. But then somehow it all comes together and the colors still converge nicely and have a fairly linear response. People can adjust the color temperature and even the spot size and it somehow doesn’t result in convergence issues or gamma imbalance.

1 Like

My concern here isn’t about convergence or gamma inbalance. It’s about the scanline thickness, the expanding size of individual phosphors, and glow/afterglow, all of which are things that CRT shaders do deliberately. I want to make sure that my signal and color effects are able to make sense when combined with a full CRT effect.

(Another thing is with color bleeding, when the settings for contrast and color are set too high for the CRT to handle, but that’s more of an “eye candy” effect that doesn’t need to be accurate and isn’t going to be used by anyone for more than maybe 10 minutes.)

Am I not understanding your post correctly?

I’m not sure. You are geting into complicated territory where things stop being able to be described with math. Empirically, we would expect to see red fringing around pure white scanlines. If we can’t see that, it doesn’t mean the effect doesn’t exist, but it could be too insignificant to have a visible effect or be compensated by some other mechanism. Chromatic aberration makes it difficult to measure this.

1 Like

what kind of information is needed?

anyway, there are https://www.reddit.com/r/crtgaming/comments/1lrv725/does_anyone_know_why_red_and_blue_usually_color/

here some images

also I remember it was randomly moving (change size), and as said in the comments of reddit link, it kinda happen more in red and less in blue and very less in green

2 Likes