New CRT shader from Guest + CRT Guest Advanced updates

That was the first thing I did, as I figured interlacing would be likely to throw a wrench into things. I ended up trying a few other shaders to see if any of them did something similar, and sure enough, crt-aperture does through a parameter called Scanline Offset. With it off, it behaves like modern GDV, but turned on, it looks like guest-SM, on hi-res content anyway. It appears to work by shifting the lines down by a single pixel, resulting in the desired look.

2 Likes

I remember reading about the dev conversation of crt-aperture. It has, as i remember, a special mode to display scanlines 4-pixel thick (like for 800p etc. displays).

Something like this:

xxxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxxx
-----------

instead of:

-----------
xxxxxxxxxxx
xxxxxxxxxxx
-----------
1 Like

Indeed, the Scanline Offset parameter I speak of in crt-aperture appears to do that.

On another note, I have a question about the grade pass you included that can be inserted into GDV. Grade has a CRT gamma parameter, set to 2.5 as default. Given that GDV already has Gamma input and output parameters, how does grade’s gamma parameter interact with that? What should it be set to?

2 Likes

Hello, I like some of the qualities of the Royale shader but I do not like the hit to performance. After messing with the latest Guest I feel I have something that is a good substitute. I get similar colors, clipping on saturated beams, and the more pronounced mask “dot-i-ness”. It’s not accurate to any kind CRT but it looks nice on my 4k laptop.

Royale Crop

Guest Crop

shaders = "12"
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 = "false"
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 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "PrePass"
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/avg-lum.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
alias4 = "AvgLumPass"
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/linearize.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "LinearizePass"
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/gaussian_horizontal.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "absolute"
scale_x6 = "800"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "GlowPass"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "800"
scale_type_y7 = "absolute"
scale_y7 = "600"
shader8 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "true"
srgb_framebuffer8 = "false"
scale_type_x8 = "absolute"
scale_x8 = "800"
scale_type_y8 = "absolute"
scale_y8 = "600"
shader9 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = "BloomPass"
float_framebuffer9 = "true"
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/crt-guest-advanced.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "viewport"
scale_y11 = "1.000000"
TNTC = "4.000000"
wp_saturation = "1.100000"
interm = "0.000000"
m_glow = "1.000000"
m_glow_dist = "1.999999"
m_glow_mask = "0.000000"
SIGMA_HB = "0.500000"
glow = "0.300000"
bloom = "0.100000"
mask_bloom = "0.500000"
halation = "-0.150000"
brightboost = "0.900000"
brightboost1 = "1.300000"
gsl = "-1.000000"
scanline1 = "20.000000"
scanline2 = "20.000000"
beam_min = "1.899999"
beam_max = "1.100000"
scans = "1.000000"
h_sharp = "6.999998"
shadowMask = "11.000000"
maskstr = "0.850000"
maskboost = "2.750000"
mask_gamma = "1.500001"
double_slot = "1.000000"
mclip = "0.150000"
deconrr = "1.000000"
deconrb = "-1.000000"
deconrry = "1.000000"
deconrby = "-1.000000"
decons = "0.000000"
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"

While subtle, changing the mask type, size, or RGB vs BGR, all effects the clipping on saturated beams and will probably be different for every display.

5 Likes

As i recall, grade’s gamma loop is closed, which means after grade finishes it’s color processing, the color space is ‘reset’ to original. Similar happens with my color grading, which involves different types of gamma strengths. Otherwise the overall image appearance would be very notable darkish.

So you can handle the grade gamma in its own environment, preferably leave it as it is.

2 Likes

Hey, some nice tweaking. I also tried some new features lately…with nice results i guess… :grin:

ntsc_phase = "4.000000"
ntsc_cscale = "1.999999"
ntsc_sharp = "-7.000000"
CSHARPEN = "0.500000"
CCONTR = "0.200000"
FINE_BLOOM = "3.000000"
mask_bloom = "-0.600000"
halation = "-0.100000"
gamma_c = "1.300000"
clips = "0.500000"
gsl = "-1.000000"
scanline1 = "5.000000"
scanline2 = "7.000000"
beam_min = "1.100000"
scans = "1.500000"
ssharp = "0.150000"
shadowMask = "6.000000"
maskstr = "1.000000"
maskboost = "1.500000"
slotmask = "1.000000"
slotmask1 = "1.000000"
smask_mit = "0.700000"

NTSC preset with “NTSC” color LUT option selected.

10 Likes

Loving both posts from @guest.r and @BendBombBoom. @BendBombBoom I always wondered what a royale style guest preset would look like and you got it pretty close.

@guest.r I also switched the LUT in the grade shader and that’s exactly what my next update is based on. I also experimented tweaking a setting called “crt hue”. Changing that value by just 1 in the negative value gives skin tones this almost “pinkish” hue to skin tones, it’s very subtle but kind of reminds me of the posts by you two above. Still deciding if I should go with that look or not. These are just my tweaking thoughts out loud don’t mind me lol.

2 Likes

This is a silly question, but to achieve similar result do you mean we use the “guest advanced HD” and then change those parameters you listed?

I have a tiny bit experience with changing values, but when you post things like this Im unsure if it means more steps aswell.

1 Like

Hey there!

Yes, most certainly. It would be optimal if you just load the guest-advanced-hd (and change a parameter or two), save the preset and then copy/paste the listed parameters into the appropriate place in the preset text file. Saves a lot of time and works very nice.

Ah ok, Im usually sitting in the sofa using my controller when I do this (and the emulator is not close) so Its a little hassle to copy paste actually, thats why I just change the parameters right then and there, but saving a new preset is smart!. But as long as I know what to do I will try this out.

It reminds me of some arcade-machines when I was small so this will be really cool for some of those games.

1 Like

Trying a quick aperture setup with xbr x3 scale (instead of stock shader). The HD version is very nice with pre-scalers.

internal_res = "2.200000"
m_glow = "1.000000"
FINE_BLOOM = "3.000000"
IOS = "2.000000"
glow = "0.150000"
mask_bloom = "-0.750000"
gamma_c = "1.200000"
clips = "0.500000"
gsl = "2.000000"
scanline1 = "5.000000"
scanline2 = "15.000000"
beam_min = "2.999998"
tds = "1.000000"
scans = "1.800000"
shadowMask = "12.000000"
maskstr = "1.000000"
maskboost = "1.350000"
mask_zoom = "-3.000000"
deconrr = "1.000000"
deconrb = "-1.000000"
deconrry = "1.000000"
deconrby = "-1.000000"
10 Likes

thanks again guest.r for your great shaders. do you it could possible to implement the “tate orientation” setting on the HD version of your shader? thanks regards

1 Like

TATE mode doesn’t allow some more recent performance optimizations, so it’s currently only available in the standard version.

Fortunately, the standard’s version filtering is adequate for vertical resolutions, maybe there is a disadvantage with pre-scalers, but should be better with xBR at 2x or super-xbr.

3 Likes

Ok thanks for the clarification. Regards

1 Like

@guest.r Just a quick message to notify you that cmask = min(cmask, 1.0); is missing from deconvergence-ntsc.slang. It will fix mask boost, now I can use same settings between normal and ntsc presets.

Normal guest

Ntsc preset with same values

6 Likes

Hey there. Dunno if it’s on purpose, but probably not. :grin: I’m fixing some more stuff and will probably include the mask fix in next release. Thanks again for the “find”.

5 Likes

New Release Version (2023-10-24-r1):

Notable changes:

  • Mask clamping fixed in non-standard verisons.
  • New scanline saturation implementation with a nice performance bump.

Download link:

https://mega.nz/file/8hpiXLxJ#qslf9b6FrjD7p0rdlW6tRLFFI14x87UDc8wkKX4m7k0

16 Likes

Nice. Was hoping you had included the last upgraded grade shader that Dogway put out but it’s not a big deal, forgot what was even upgraded there.

1 Like

Yeah, sorry i forgot about it. I think i’m going to make another update next week which will include the newest grade version plus some stuff, if anything else comes to my mind.

4 Likes

It’s all good no worries. Currently your shader is in top form to me since you added those base mask and clip saturation settings, I feel spoiled almost at this point lol. I’ll be on the look though and thank you as always.

3 Likes