Now I’m really liking what the gdv slotmask looks like by itself. The versatility of this shader is amazing.
Not necessary, since masks are basically a flat overlay, only calculated. You should only avoid settings which don’t look appealing and might happen with curvature. These mostly happen if you use stronger scanlines and stronger masks together, in general.
Type 0 out of the box, other types with tweaking.
Very nice. I raised beam shape low/high a bit and applied my own sharpness settings. Still playing around with the smart smoothing.
shaders = "8"
shader0 = "shaders_slang/misc/grade.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "StockPass"
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 = "PrePass"
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/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/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/crt/shaders/guest/crt-gdv-new/blur_horiz2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "absolute"
scale_x5 = "800"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/crt-gdv-new/blur_vert2.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = "GlowPass"
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "absolute"
scale_x6 = "800"
scale_type_y6 = "absolute"
scale_y6 = "600"
shader7 = "shaders_slang/crt/shaders/guest/crt-gdv-new/crt-guest-dr-venom2.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "viewport"
scale_x7 = "1.000000"
scale_type_y7 = "viewport"
scale_y7 = "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;bogus_afterglow;PR;PG;PB;AS;sat;bogus_color;TNTC;CP;CS;WP;wp_saturation;lsmooth;GAMMA_INPUT;bogus_glow;SIZEH;GLOW_FALLOFF_H;SIZEV;GLOW_FALLOFF_V;bogus_brightness;glow;bloom;gamma_c;brightboost;brightboost1;bogus_scanline;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;vertmask;scans;spike;bogus_filtering;h_sharp;s_sharp;smart_ei;ei_limit;sth;bogus_screen;TATE;IOS;OS;BLOOM;csize;bsize;warpX;warpY;bogus_masks;shadowMask;masksize;maskDark;maskLight;CGWG;mcut;mask_gamma;slotmask;slotwidth;double_slot;slotms;mclip;bogus_interlacing;inter;interm;gamma_out"
g_gamma_in = "2.400000"
g_signal_type = "1.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.000000"
g_cntrst = "0.000000"
g_mid = "0.500000"
wp_temperature = "8005.000000"
g_sat = "0.000000"
g_vibr = "0.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"
bogus_afterglow = "0.000000"
PR = "0.140000"
PG = "0.140000"
PB = "0.140000"
AS = "0.070000"
sat = "0.100000"
bogus_color = "0.000000"
TNTC = "0.000000"
CP = "0.000000"
CS = "0.000000"
WP = "0.000000"
wp_saturation = "1.000000"
lsmooth = "0.750000"
GAMMA_INPUT = "2.400000"
bogus_glow = "0.000000"
SIZEH = "4.000000"
GLOW_FALLOFF_H = "0.300000"
SIZEV = "4.000000"
GLOW_FALLOFF_V = "0.300000"
bogus_brightness = "0.000000"
glow = "0.000000"
bloom = "0.000000"
gamma_c = "1.000000"
brightboost = "1.400001"
brightboost1 = "1.300001"
bogus_scanline = "0.000000"
gsl = "2.000000"
scanline1 = "15.000000"
scanline2 = "27.000000"
beam_min = "1.300000"
beam_max = "1.000000"
beam_size = "0.600000"
vertmask = "0.000000"
scans = "0.600000"
spike = "1.000000"
bogus_filtering = "0.000000"
h_sharp = "3.000001"
s_sharp = "1.000000"
smart_ei = "1.000000"
ei_limit = "1.000000"
sth = "0.500000"
bogus_screen = "0.000000"
TATE = "0.000000"
IOS = "0.000000"
OS = "1.000000"
BLOOM = "0.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
bogus_masks = "0.000000"
shadowMask = "-1.000000"
masksize = "1.000000"
maskDark = "0.500000"
maskLight = "1.000000"
CGWG = "0.500000"
mcut = "0.000000"
mask_gamma = "2.400000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
slotms = "1.000000"
mclip = "0.000000"
bogus_interlacing = "0.000000"
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"
OK, I think I will use the current settings. Thank you.
Just did some experiments, and having the active subpixels adjacent to each other definitely looks worse due to bloom/bleed etc, coming from the display itself and/or the shader. It looks much better when the subpixels are evenly spaced (as in oxoxoxoxox). This is kinda the same reason why the two-color masks look better (more natural) than the three color masks.
It’s a very easy change to the code to get blue/yellow, for anyone who is interested. It’s definitely worth it if you have RBG subpixels. Sharing it here for those who might benefit.
// Phosphor.
else if (shadowMask == 0.0)
{
pos.x = fract(pos.x*0.5);
if (pos.x < 0.5) { mask.r = mc; mask.g = mc; mask.b = 1.0; }
else { mask.r = 1.0; mask.g = 1.0; mask.b = mc; }
}
How do I say “black” here? There are a few different varieties that can work for RBG displays, here.
would it be (for example)
mask.r = 1.0 mask.b = 1.0 mask.g = 1.0 mask.rgb = 0
// 4k mask
else
{
mask = vec3(mc);
pos.x = fract(pos.x * 0.25);
if (pos.x < 0.2) mask.r = 1.0;
else if (pos.x < 0.4) mask.rg = 1.0.xx;
else if (pos.x < 0.7) mask.gb = 1.0.xx;
else mask.b = 1.0;
}
return mask;
}
@Nesguy @hunterk The LG C9 appears to be WBGR Given that, which masks should I be using? I have to admit that they all ‘seem’ to look good but it bugs me that I may not be selecting the ideal mask config. Advice?
That white subpixel is really annoying, washing out the picture to get bright.
Are you using a shader in that close up?
Can you turn off the white subpixel by disabling HDR or anything? Lowering brightness/contrast?
Any mask for BGR would work if you can figure out how to turn off the white subpixel, which might not be possible without killing the brightness.
Idk, you might be screwed as far as subpixel-respecting masks are concerned, but naive tiling @ 4k should be okay at normal viewing distance (so any of the three color masks).
That pic is not mine; I tried to take my own pic but it’s nowhere near as clear. As for looking washed out – anything but! The C9 looks gorgeous. When you say naive do you mean lotte’s masks?
“naive” just means: without taking subpixels into account at all. That is, just taking a pattern and tiling it out.
At least some of Lottes’ masks are perpendicular to the subpixel structure, and therefore don’t interact as much with it, and that’s probably a good strategy to try. However, if the others (that is, the regular masks) look good to you, that’s all that matters.
That’s literally how it works though, adding white to the image washes it out and that’s a known issue with WRGB and its variants. I’m not saying that it doesn’t look amazing, but it doesn’t look as good as it could without the white subpixel. Basically it’s not doing 100% of Rec 2020 / HDR / whatever, but then again almost no display is.
Of the “subpixel agnostic” options: You could try any of the three color aperture masks (2, 6) + the GDV slotmask and set slotmask width to 3.00 and slotmask height to 4. Or you could try the rotated mask that @hunterk mentioned (mask 3). Another option is to just use the GDV slotmask by itself.
I think i have a solution with a new mask, instead of black and white or magenta-green you can use Grey and Grey.
Default preset with mask strength 1.00 and screenshots with different mask size.
- Mask BW (7.0) size 1.0
- Size 2.0
- Grey and grey 1.0
- Size 2.0
The values are 40 brightness and 42,42,42 (RGB) ( 240/6) and 200 brightness and 212,212,212 (RGB).
Average color picture 127.0
Maybe i should post on pasteboard
Yes, this is a good “subpixel agnostic” alternative, could be good for a lot of displays with weird subpixels.
On the original GDV shader, for N64 and PS1 games I used to be able to downscale content to 240px in order apply consistent CRT scanlines.
However on the new version ( crt-guest-dr-venom2.slangp ) if I do the same e.g. add the following lines to the first pass:
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "absolute"
scale_y0 = "240"
I can’t get the scanlines to show, do you know why this could be happening?
It’s necessary, because a custom sized buffer is used for glow and it felt convenient to use the built-in and fixed original size for scanlines, which also means resizing any pass can’t have any effect. OTOH you can check the hires and ntsc versions, which are adapted for hires content. They have new interlacing modes, which also support internal resolutions (modes 4…12). And wider filters, if you want better filtering, and deconvergence.
A question about this, how does “Interlace Mode, 4.0 …> internal resolution” work?
Could you explain what it does?
Odd modes are internally “downsampling” by 2.0x, 3.0x and 4.0x, even by 1.5x, 2.5x, 3.5x and 4.5x. So you can find the best divider with current game and output resolution.
In general, a fixed pass isn’t needed, because 480y content is handled equivalently with ‘interlacing mode 5’ or pre-downsampling to 240p, maybe the latter is a bit faster. Otherwise, the same issue is involved as with normal version. I think there is a workaround by passing the parameter, but didn’t test it.
Just tried the hires version and upping the number on the interlacing modes does show scanlines, whilst maintaining from what I can tell, a better picture quality than downscaling to 240 via the 1st pass method - so that’s a win!
However, I have noticed in games like Tekken 3 on the PS1, the hires version of the shader, the scanlines seem to switch sizes as the games internal resolution changes on the fly, e.g. on the boot up screen I have good looking scanlines then when the game loads the scanlines go big.
I think it’s good i got some feedback on this. I can change this by using a new parameter for internal resolution only. Like 0.0 = normal, 1.0 = 240y, 2.0…10.0 = internal y resolutions. This should really solve all problems since you can even have interlacing! with internal resolution downsample, which is more authentic behaviour.