New CRT shader from Guest + CRT Guest Advanced updates

Ringing isn’t that notable because of the anti-ringing which is implemented. It’s a good implementation to 4 colors clamping, filter native 5 would allow too much ringing already. In fact, Hyllian started with anti-ringing and his shader is very nice about it (cheers Trogglemonkey too). His default filtering method is polynomial Catmull-Rom Spline filter, but you can edit the shader for some alternatives.

1 Like

Guess it’s a good release version. I tweaked the shader for good brightness, contrast and performance. It would be very nice, if the SLANG repo version could be updated. Many thanks. :smile:

https://mega.nz/#!t1xAzS4T!NkjlMLf3K--gCSzYy3T0Bl0PHSK-kWIotWctmpgTw3A

4 Likes

I really like your crt shader @guest.r It runs great on my surface pro 6. The newest incarnation looks even better but runs slower. I got 120 fps with the old one and a little less than 90 fps in this one. (Using vulcan as my video drivers.) Not a huge deal but I’d like it the faster one could hang around as well.

You can always access older versions of shaders through the git history:

I was never too happy with the way glow is implemented in crt-guest-dr-venom, although it’s a decent placeholder. I tinkered with the effect recently and made a decent upgrade of the effect. It’s a bit slower now, but not too much.

I would be also glad for some feedback regarding the new glow implementation, maybe i missed a thing or two.

You can download the shaders here:

https://mega.nz/file/o5gljC7A#8Lnv4pIHVrvarYxPKCOJemibIUbZ5sk4r_UtqnuVdlw

Some new files are added, as well as a newer main shader version. In case this would be updated, other presets should work as before.

6 Likes

Can you comment on some of the changes you made to the new version (2?) I’m playing around with these now.

1 Like

It’s not really a “2.0 version” :grin:, i had to come up with a name for a version which supports the new glow implementation. It might not be compatible with the NTSC presets, so both versions are required in general.

The changes are in general:

  • smaller step for the glow effect
  • much better low radius glow (default is really bad)
  • easier to setup and change settings
  • also better larger radius glow
  • bit slower, but not that much.

I took into consideration that new parameters (range, defaults) are very similar to the old system. Only the effect should do nicer in most cases.

5 Likes

Ah, OK that explains why v1 looked samey and v2 the glow looks nicer. Good work!

5 Likes

I put some more work into the crt-guest-dr-venom and improved and rearranged many things. Most notable are trinitron crt masks, slotmask, deconvergence, filtering, parameters etc. There is also a new NTSC version, should work quite nice.

Install instructions:

After unpacking the folder, it should reside in the shaders\shaders_slang folder. If it’s location is not exact the NTSC preset won’t work.

If someone finds a bug, regression or anything annoying, please let me know. :smiley:

Download link:

https://mega.nz/file/15RG3DDL#d9pirpgV50Rc6Y4mI-lIdwRyv4Ge13mUoPVuceR0I2U

Happy shading!

Edit: quick fix for trinitron masks.

Edit2: i actually remembered a request about an annoyance regarding increased brightness when a game was switching between regular and interlaced modes. Mitigated now.

12 Likes

Sounds like you done changed the game once again, can’t wait to get home and play around with this. The guest shader is arguably the best crt shader on RetroArch as of now. I always felt like guest and the grade shader should officially become one since they play so well off of each other.

3 Likes

This is looking great thanks @guest.r ! The Glow looks much more natural :slight_smile: I also really enjoy the deconvergence. The code is looking nicely simplified too :slight_smile: Awesome update all around :slight_smile:

One of the things I notice about the deconvergence and I’m not sure if it can be fixed is that the overall brightness of the image is reduced as the deconvergence moves from 0 towards 1 or 0 towards -1

I had noticed this in the past as well, Thanks for fixing this!!!

2 Likes

Thanks, @guest.r! Your CRT shader is the best and the most complete.

:blue_heart:

3 Likes

This is a great update. Perhaps the glow would also benefit if it could also be more saturated in color. I’m not sure what you did but the masks looks better overall. They don’t blow out as fast in the brights and are easier to manage. I also like the convergence which doesn’t cause me uneven scan-lines as they did in the previous one. Here are two shots. The first is a 4k crop of CRT mask 1.The second is Mask 5 and the slot mask combined. I think it get better fidelity with the slot mask.

3 Likes

Thanks for the update!

After a bit of testing I’m finding there is something odd with Scanline Type 2. The dark tones are too dark and the bright tones too bright whatever you tweak on the parameters.

In the 240p color bars test it is simply no longer possible to replicate a non gamma adjusted curve (when having gamma input and output at the same value, with some tweaking it should be possible to get the raw output color values in the center of the scanlines). This was possible with the original guest-venom shader.

For scanline high and low settings > 10 it blows out the whites. Brightboost dark colors doesn’t really affect the first dark columns, and if you boost it a lot, then then whites at the end of the scale get washed out in the color bars test.

(It seems the gamma curve gets shifted for some reason on type 2?)

Overal a degradation for scanline type 2 versus the official V1 version IMO. Sorry :frowning:

As a general issue I noticed that for all of the scanline type “white” is not white. If you use a color picker on the shader output, white never reaches the value “255”, it stays at 253/254 regardless of changing any of the brightboost parameters.

2 Likes

Good catch! It was actually a mask bug, will be fixed in next release. I compared the new version with the regular one and now i’t back to old behaviour.

Yeah, i changed a lot of code and i’m trying to avoid regressions. Feedback is very helpful. :wink:

It’s most probably declipped by a mechanism which maintains scanline scape intact, but since i try not to add new shader parameters it’s coded into the shader. Otherwise scanlines would get flat even with moderate brightboost parameters. Maintaining shape means values < 255 though.

3 Likes

It can be mitigated quite nicely. Although the current implementation favors thicker scanlines. I will work a bit on the scanline deconvergence, hopefully an extra pass isn’t needed.

I also had something similar in mind, so it’s a very welcome suggestion to get this moving. In the new version glow is the same in very dark areas, but desaturates less over bright parts, is less invasive and doesn’t increase the brightness that much. Feedback is still welcome.

Here is the new version (9.11.2020-r1). Installation tips are a few posts above.

https://mega.nz/file/N9BVSIpb#F-W7V9MYYYIE3Wd8GM7SczQAojHdXrLtwB8bD43ko98

2 Likes

I haven’t had time to really dive into this but here are some initial tests. I used the same settings. Old guest-dr-venom is looking better, here. Suggestions?

Old guest-dr-venom

New guest-dr-venom

shaders = "12"
shader0 = "shaders_slang/misc/grade.slang"
filter_linear0 = "true"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "WhitePointPass"
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/misc/glass.slang"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
shader2 = "shaders_slang/crt/shaders/guest/afterglow.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/avg-lum.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "AvgLumPass"
float_framebuffer3 = "true"
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/linearize.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "LinearizePass"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/blurs/kawase/kawase0.slang"
filter_linear5 = "true"
wrap_mode5 = "mirrored_repeat"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "true"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/blurs/kawase/kawase1.slang"
filter_linear6 = "true"
wrap_mode6 = "mirrored_repeat"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "false"
srgb_framebuffer6 = "true"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/blurs/kawase/kawase1.slang"
filter_linear7 = "true"
wrap_mode7 = "mirrored_repeat"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "true"
scale_type_x7 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/stock.slang"
filter_linear8 = "true"
wrap_mode8 = "mirrored_repeat"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "false"
srgb_framebuffer8 = "true"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/stock.slang"
filter_linear9 = "true"
wrap_mode9 = "mirrored_repeat"
mipmap_input9 = "false"
alias9 = "GlowPass"
float_framebuffer9 = "false"
srgb_framebuffer9 = "true"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "source"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/guest/linearize_scanlines.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
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/crt-guest-dr-venom.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"
parameters = "g_gamma_in;g_signal_type;g_gamma_type;g_crtgamut;g_space_out;g_hue_degrees;g_I_SHIFT;g_Q_SHIFT;g_I_MUL;g_Q_MUL;g_lum_fix;g_vignette;g_vstr;g_vpower;g_lum;g_cntrst;g_mid;wp_temperature;g_sat;g_vibr;g_satr;g_satg;g_satb;g_lift;blr;blg;blb;wlr;wlg;wlb;rg;rb;gr;gb;br;bg;LUT_Size1;LUT1_toggle;LUT_Size2;LUT2_toggle;g_csize;g_bsize;g_flicker;g_shaker;g_refltog;g_reflgrain;g_reflstr;g_fresnel;g_reflblur;gz;gx;gy;gzr;gzg;gzb;goxr;goyr;goxg;goyg;goxb;goyb;TO;PH;PER;ASAT;temperature;luma_preserve;wp_red;wp_green;wp_blue;SW;AR;PR;AG;PG;AB;PB;sat;lsmooth;GAMMA_INPUT;bloom_threshold;TATE;IOS;OS;BLOOM;brightboost;brightboost1;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;h_sharp;s_sharp;csize;bsize;warpX;warpY;glow;shadowMask;masksize;vertmask;slotmask;slotwidth;double_slot;slotms;mcut;maskDark;maskLight;CGWG;gamma_out;spike;inter;interm;bloom;scans"
g_gamma_in = "2.500000"
g_signal_type = "0.000000"
g_gamma_type = "1.000000"
g_crtgamut = "2.000000"
g_space_out = "0.000000"
g_hue_degrees = "0.000000"
g_I_SHIFT = "0.000000"
g_Q_SHIFT = "0.000000"
g_I_MUL = "1.000000"
g_Q_MUL = "1.000000"
g_lum_fix = "0.000000"
g_vignette = "0.000000"
g_vstr = "40.000000"
g_vpower = "0.200000"
g_lum = "0.100000"
g_cntrst = "0.010000"
g_mid = "1.000000"
wp_temperature = "8004.000000"
g_sat = "0.100000"
g_vibr = "1.000000"
g_satr = "0.000000"
g_satg = "0.000000"
g_satb = "0.000000"
g_lift = "0.000000"
blr = "0.000000"
blg = "0.000000"
blb = "0.000000"
wlr = "1.000000"
wlg = "1.000000"
wlb = "1.000000"
rg = "0.000000"
rb = "0.000000"
gr = "0.000000"
gb = "0.000000"
br = "0.000000"
bg = "0.000000"
LUT_Size1 = "16.000000"
LUT1_toggle = "0.000000"
LUT_Size2 = "64.000000"
LUT2_toggle = "0.000000"
g_csize = "0.000000"
g_bsize = "2000.000000"
g_flicker = "0.000000"
g_shaker = "0.000000"
g_refltog = "1.000000"
g_reflgrain = "0.000000"
g_reflstr = "0.000000"
g_fresnel = "0.000000"
g_reflblur = "0.000000"
gz = "1.000000"
gx = "1.000000"
gy = "1.000000"
gzr = "1.000000"
gzg = "1.000000"
gzb = "1.000000"
goxr = "0.020000"
goyr = "0.000000"
goxg = "0.000000"
goyg = "0.020000"
goxb = "0.000000"
goyb = "0.000000"
TO = "0.000000"
PH = "2.000000"
PER = "0.750000"
ASAT = "0.200000"
temperature = "6500.000000"
luma_preserve = "1.000000"
wp_red = "-0.000001"
wp_green = "-0.000001"
wp_blue = "-0.000001"
SW = "1.000000"
AR = "0.070000"
PR = "0.050000"
AG = "0.070000"
PG = "0.050000"
AB = "0.070000"
PB = "0.050000"
sat = "0.100000"
lsmooth = "0.900000"
GAMMA_INPUT = "3.499999"
bloom_threshold = "0.000000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
brightboost = "1.000003"
brightboost1 = "3.000000"
gsl = "0.000000"
scanline1 = "1.000000"
scanline2 = "23.000000"
beam_min = "2.500000"
beam_max = "1.000000"
beam_size = "0.000000"
h_sharp = "4.000000"
s_sharp = "0.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
glow = "0.000000"
shadowMask = "1.000000"
masksize = "1.000000"
vertmask = "0.000000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
slotms = "1.000000"
mcut = "0.250000"
maskDark = "0.500000"
maskLight = "1.500000"
CGWG = "0.000000"
gamma_out = "3.499999"
spike = "1.000000"
inter = "400.000000"
interm = "1.000000"
bloom = "0.000000"
scans = "1.000000"
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"
2 Likes

@Nesguy I’d start over in terms of beam, scanline, and brightboost min and max. I think the changes are enough you have to start over with the previous version as a guideline. At least that has been true with my tweaking thus far.

3 Likes

It’s really best to start with the new today’s version. Some parameters were rebalanced though so it’s not an 1:1 transition. Especially glow. Most notable brightness changes are connected with masks 5,6,7 and the slotmask . Slotmask became much more predictable and goes better with scanline beams for example.

3 Likes

Ah, didn’t realize it was that big of a change!

BTW you gave me an idea, looking at your settings, I think contrast pivot and contrast settings in grade can be used to compensate for the slightly lower max white in GDV (< 255)

Haven’t had time to really experiment with it though. I just set pivot @ 100% and contrast at 0.01, but now brightness and saturation probably need to come up.

@guest.r am I on to something with this idea?