New release: crt-royale-1080p-v7
I mirrored the aperture grile LUTs so that it looks correct in RGB monitors. Original LUTs are done for BGR displays.
Other than that, now I’m using the NTSC LUT from guests, as I think it looks more balanced than the reshade trinitron lut (biased towards green).
Hmmm…This seems interesting. This might allow me to get proper looking phosphors on my LG OLED TV.
Is it as simple as loading up the PNG and flipping it horizontally in an image editor?
Can these mirrored LUTs be included in RetroArch alongside the standard ones?
This is one of the first things I changed.
Grade is also a nice option for this.
Screenshots look great by the way!
Would you mind sharing your setting?
Yes. I just used Paint and it worked flawlessly!
Dunno if we should change the original release, as the author isn’t available to approve such changes. @hunterk should know better. I think any modifications may be released as a variant.
I think just adding some LUTs isn’t a big deal, though I think the shader is intentionally not subpixel-aware, for better and for worse. That is, it would have been easy to generate the masks programmatically, but TroggleMonkey chose to use the LUTs and scale them around instead.
This makes it look not-as-crisp as a programmatic, subpixel-aware mask at lower resolutions (presumably hence the ol’ not-quite-accurate adage that royale was designed for 8K), but it looks the same everywhere, even on displays with funky subpixel layouts.
There you go, just save it in a txt editor as .slangp and place it in the main shaders directory.
Let me know if it’s any good on your monitor!
shaders = "18"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.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/advanced/stock.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "StockPass"
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/afterglow0.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "AfterglowPass"
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/pre-shaders-afterglow.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "PrePass0"
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/ntsc/ntsc-pass1.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "NPass1"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "4.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "0.500000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass3.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
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/custom-fast-sharpen.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "NtscPass"
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/stock.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "true"
alias8 = "PrePass"
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/avg-lum-ntsc.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "AvgLumPass"
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/linearize-ntsc.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "LinearizePass"
float_framebuffer10 = "true"
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/crt-guest-advanced-ntsc-pass1.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = "Pass1"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = ""
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"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = "GlowPass"
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"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = ""
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"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = "BloomPass"
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/crt-guest-advanced-ntsc-pass2.slang"
filter_linear16 = "true"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
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-ntsc.slang"
filter_linear17 = "true"
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
alias17 = ""
float_framebuffer17 = "false"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
wp_saturation = "1.200000"
pre_bb = "1.020000"
BP = "-15.000000"
quality = "-1.000000"
ntsc_scale = "1.025000"
ntsc_cscale = "2.100000"
ntsc_sat = "0.950000"
ntsc_bright = "1.010000"
ntsc_ring = "1.000000"
ntsc_sharp = "-1.500000"
CSHARPEN = "0.800000"
CCONTR = "0.070000"
CDETAILS = "0.150000"
m_glow = "1.000000"
glow = "0.120000"
bloom = "0.200000"
mask_bloom = "0.200000"
bloom_dist = "0.200000"
halation = "-0.050000"
gamma_c = "0.950000"
gsl = "1.000000"
scanline1 = "15.000000"
scan_falloff = "1.500000"
scangamma = "3.099999"
warpX = "0.040000"
warpY = "0.060000"
csize = "0.080000"
bsize1 = "0.150000"
shadowMask = "6.000000"
maskstr = "0.850000"
mcut = "1.250000"
maskboost = "1.100000"
smoothmask = "1.000000"
deconrr = "0.500000"
deconrb = "-0.500000"
deconrry = "0.500000"
deconrby = "-0.500000"
decons = "1.400000"
addnoised = "0.280000"
noiseresd = "1.000000"
post_br = "1.220000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"
I tried the LUT flipping. It didn’t work. The phosphor sizes looked a little improved but I was still getting some weirdness like yellow phosphors and stuff like that. Wasn’t able to get any to align properly with my LG OLED TV’s funky subpixel layout.
Maybe it’s supposed to look the same everywhere but I doubt what I’m seeing with on my OLED with funky subpixels using the normal LUTs is what someone with a regular RGB or BGR LED TV might see.
Maybe things might have looked better if I could have converted the phosphor colour order to RBG instead of BGR. RBG seems to work best for LG OLED TV funky subpixel layouts.
So what I see with the normal LUTs is a big Red, big Green and a very thin Blue phosphor.
This doesn’t affect normal viewing distances though. It’s only if one goes close to the screen that you can see a problem.
Guys, I now have an LG C2 65" OLED 4K TV and wanted suggestions on what 4K shaders to use playing old 16-bit console games (mainly SNES and Genesis) in Retroarch. Needless to say, these old games look terrible on such a huge display (I sit about 10’ away) with just the raw pixels. I’ve previously been using CRT-EasyMode on my old 1080p displays because I liked it’s more subtle scanlines look but wanted something updated to complement my new 2160p TV. Any recommendations?
New update for Super Nintendo, and added a single file for the Mega Drive, Neo Geo, Saturn and PS1. My recommendation for the Mega Drive is to use Genesis GX, and inside the core options in video options, on Border options select top and bottom option, and the option Master system Hide left border only. If You don’t use this, It won’t look the same. For Neo Geo use Final Burn Neo. For the saturn, use Bettle Saturn, for the Snes use BSNES (NOT BSNES HD), on this emulator the shaders look stronger and sharper than Snes9X. For BSNES, in core options choose video options, and set crop to off.
This is an example of how Mega Drive Looks with those core options activated:
And BSNES with crop options off.
Enjoy !!!
hello I have a question about the possibility of creating a crt Geom for the blooming process. Do you think this would be possible?
Are you telling about using the same “bloom” in Royale’s? Your best option would be using crt-geom-deluxe.
Generally not a fan of CRT Royale-based shaders (the scanlines are far too intense and obvious for my tastes) but have previously used and liked CRT-EasyMode and CRT-Geom in some of my configurations. I used CRT-Geom in a DOSBox build and was extremely pleased with how much it seemed to properly simulate VGA from my old VGA monitors (SVGA was a little less convincing however). If I were to go back to EasyMode or Geom, do I need to find special 4K versions or configure them or do they automatically scale properly to 2160p?
Did you see my post above? I provided you with 7 different options. All modern. All suited to your 4K HDR OLED Display.
The intensity of the scanlines in a shader depends on how the shader is configured. There’s no one look, instead there are almost infinite possibilities.
Just load crt-consumer (GLSL at the moment) remove the last pass “crt-consumer” and append “crt-Geom”. Adjust crt-Geom gamma in (set it to 1.0). I think it’s called “Target Gamma”
Long time no see, but i’m playing (messing) randomly with unsorted things in a local git repo; i’ll have to sort thing out soon or later!
Btw:
-
Experimenting dumb box blur with a tail of unsharp mask versus lanczos filtetring, and the results in terms of sharpness and roundness (scanline weight) are very good and lower than lanczos on resource usage.
-
I’m also playing with tight haloing to achieve better colors
-
Also, work for allowing the blur to act like a dilation or erosion filter
Eroded:
Neutral:
Dilation:
I think dilation may better represent the real crt behaviour, but erosion may come handy to achieve better sense of sharpness and sexyness; since the code is the same, i’ll keep it both (or none, lol!)
Tweaked for content: