mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-27 01:41:31 +11:00
more updates to crt-guest-dr-venom
"Unfortunately or fortunately i found a conflict of settings in the shader. With low scanline saturation the ‘PVM colors’ aren’t applied or applied very weakly. I needed to fix this. In the process i also decided to make the shader even better. I wasn’t completely satisfied with some types of filtering, as it turns out, using an even number of pixels fixes many issues with the shader. I’m also very pleased how the anti-ringing, mask reference color and scanline color turned out."
This commit is contained in:
parent
4ddf327c85
commit
5e509df3ec
|
@ -53,7 +53,7 @@ layout(std140, set = 0, binding = 0) uniform UBO
|
||||||
#define BLOOM params.BLOOM // Bloom overscan percentage
|
#define BLOOM params.BLOOM // Bloom overscan percentage
|
||||||
#pragma parameter brightboost "Bright Boost Dark Pixels" 1.40 0.50 4.00 0.05
|
#pragma parameter brightboost "Bright Boost Dark Pixels" 1.40 0.50 4.00 0.05
|
||||||
#define brightboost params.brightboost // adjust brightness
|
#define brightboost params.brightboost // adjust brightness
|
||||||
#pragma parameter brightboost1 "Bright Boost Bright Pixels" 1.20 0.50 3.00 0.05
|
#pragma parameter brightboost1 "Bright Boost Bright Pixels" 1.15 0.50 3.00 0.05
|
||||||
#define brightboost1 params.brightboost1 // adjust brightness
|
#define brightboost1 params.brightboost1 // adjust brightness
|
||||||
#pragma parameter gsl "Scanline Type" 0.0 0.0 2.0 1.0
|
#pragma parameter gsl "Scanline Type" 0.0 0.0 2.0 1.0
|
||||||
#define gsl params.gsl // Alternate scanlines
|
#define gsl params.gsl // Alternate scanlines
|
||||||
|
@ -63,13 +63,13 @@ layout(std140, set = 0, binding = 0) uniform UBO
|
||||||
#define scanline2 params.scanline2 // scanline param, vertical sharpness
|
#define scanline2 params.scanline2 // scanline param, vertical sharpness
|
||||||
#pragma parameter beam_min "Scanline dark" 1.35 0.5 2.5 0.05
|
#pragma parameter beam_min "Scanline dark" 1.35 0.5 2.5 0.05
|
||||||
#define beam_min params.beam_min // dark area beam min - narrow
|
#define beam_min params.beam_min // dark area beam min - narrow
|
||||||
#pragma parameter beam_max "Scanline bright" 1.10 0.5 2.5 0.05
|
#pragma parameter beam_max "Scanline bright" 1.05 0.5 2.5 0.05
|
||||||
#define beam_max params.beam_max // bright area beam max - wide
|
#define beam_max params.beam_max // bright area beam max - wide
|
||||||
#pragma parameter beam_size "Increased bright scanline beam" 0.70 0.0 1.0 0.05
|
#pragma parameter beam_size "Increased bright scanline beam" 0.70 0.0 1.0 0.05
|
||||||
#define beam_size params.beam_size // increased max. beam size
|
#define beam_size params.beam_size // increased max. beam size
|
||||||
#pragma parameter h_sharp "Horizontal sharpness" 5.25 1.5 20.0 0.25
|
#pragma parameter h_sharp "Horizontal sharpness" 5.25 1.5 20.0 0.25
|
||||||
#define h_sharp params.h_sharp // pixel sharpness
|
#define h_sharp params.h_sharp // pixel sharpness
|
||||||
#pragma parameter s_sharp "Substractive sharpness (relative)" 0.35 0.0 1.0 0.05
|
#pragma parameter s_sharp "Substractive sharpness (relative)" 0.40 0.0 1.0 0.05
|
||||||
#define s_sharp params.s_sharp // substractive sharpness
|
#define s_sharp params.s_sharp // substractive sharpness
|
||||||
#pragma parameter csize "Corner size" 0.0 0.0 0.07 0.01
|
#pragma parameter csize "Corner size" 0.0 0.0 0.07 0.01
|
||||||
#define csize params.csize // corner size
|
#define csize params.csize // corner size
|
||||||
|
@ -172,7 +172,8 @@ vec3 sw1(vec3 x, vec3 color, float scanline)
|
||||||
float br = clamp(0.8*beam_min - 1.0, 0.2, 0.45);
|
float br = clamp(0.8*beam_min - 1.0, 0.2, 0.45);
|
||||||
vec3 res = exp2(-scanline*ex*ex)/(1.0-br+br*mx);
|
vec3 res = exp2(-scanline*ex*ex)/(1.0-br+br*mx);
|
||||||
mx = max(max(res.r,res.g),res.b);
|
mx = max(max(res.r,res.g),res.b);
|
||||||
return mix(vec3(mx), res, scans);
|
float scans1 = scans; if (vertmask > 0.0) scans1=1.0;
|
||||||
|
return mix(vec3(mx), res, scans1);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 sw2(vec3 x, vec3 color, float scanline)
|
vec3 sw2(vec3 x, vec3 color, float scanline)
|
||||||
|
@ -183,7 +184,8 @@ vec3 sw2(vec3 x, vec3 color, float scanline)
|
||||||
vec3 ex = x*tmp;
|
vec3 ex = x*tmp;
|
||||||
vec3 res = exp2(-scanline*ex*ex)/(0.6 + 0.4*mx);
|
vec3 res = exp2(-scanline*ex*ex)/(0.6 + 0.4*mx);
|
||||||
mx = max(max(res.r,res.g),res.b);
|
mx = max(max(res.r,res.g),res.b);
|
||||||
return mix(vec3(mx), res, scans);
|
float scans1 = scans; if (vertmask > 0.0) scans1=0.75;
|
||||||
|
return mix(vec3(mx), res, scans1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shadow mask (1-4 from PD CRT Lottes shader).
|
// Shadow mask (1-4 from PD CRT Lottes shader).
|
||||||
|
@ -203,8 +205,8 @@ vec3 Mask(vec2 pos, vec3 c)
|
||||||
{
|
{
|
||||||
pos.x = fract(pos.x*0.5);
|
pos.x = fract(pos.x*0.5);
|
||||||
float mc = 1.0 - CGWG;
|
float mc = 1.0 - CGWG;
|
||||||
if (pos.x < 0.5) { mask.r = 1.0; mask.g = mc; mask.b = 1.0; }
|
if (pos.x < 0.5) { mask.r = 1.1; mask.g = mc; mask.b = 1.1; }
|
||||||
else { mask.r = mc; mask.g = 1.0; mask.b = mc; }
|
else { mask.r = mc; mask.g = 1.1; mask.b = mc; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Very compressed TV style shadow mask.
|
// Very compressed TV style shadow mask.
|
||||||
|
@ -296,7 +298,7 @@ vec3 Mask(vec2 pos, vec3 c)
|
||||||
float maskTmp = min(1.6*max(mx-mcut,0.0)/(1.0-mcut) , mc);
|
float maskTmp = min(1.6*max(mx-mcut,0.0)/(1.0-mcut) , mc);
|
||||||
mask = vec3(maskTmp);
|
mask = vec3(maskTmp);
|
||||||
pos.x = fract(pos.x/2.0);
|
pos.x = fract(pos.x/2.0);
|
||||||
if (pos.x < 0.5) mask = vec3(1.0 + 0.6*(1.0-mx));
|
if (pos.x < 0.5) mask = vec3(1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mask;
|
return mask;
|
||||||
|
@ -375,8 +377,8 @@ void main()
|
||||||
vec2 pos = Warp(texcoord*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
|
vec2 pos = Warp(texcoord*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
|
||||||
vec2 pos0 = Warp(TEX0.xy*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
|
vec2 pos0 = Warp(TEX0.xy*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
|
||||||
|
|
||||||
vec2 coffset = ((TATE < 0.5) ? vec2(0.0,0.5) : vec2(0.5, 0.0));
|
vec2 coffset = vec2(0.5, 0.5);
|
||||||
if ((interm == 1.0 || interm == 2.0) && inter <= mix(SourceSize.y, SourceSize.x, TATE)) coffset = vec2(0.0);
|
if ((interm == 1.0 || interm == 2.0) && inter <= mix(SourceSize.y, SourceSize.x, TATE)) coffset = vec2(0.5, 0.0);
|
||||||
|
|
||||||
vec2 ps = SourceSize.zw;
|
vec2 ps = SourceSize.zw;
|
||||||
vec2 OGL2Pos = pos * SourceSize.xy - coffset;
|
vec2 OGL2Pos = pos * SourceSize.xy - coffset;
|
||||||
|
@ -407,82 +409,83 @@ void main()
|
||||||
float zero = exp2(-h_sharp);
|
float zero = exp2(-h_sharp);
|
||||||
float sharp1 = s_sharp * zero;
|
float sharp1 = s_sharp * zero;
|
||||||
|
|
||||||
float wl2 = 1.5 + fpx;
|
float wl3 = 2.0 + fpx;
|
||||||
float wl1 = 0.5 + fpx;
|
float wl2 = 1.0 + fpx;
|
||||||
float wct = 0.5 - fpx;
|
float wl1 = fpx;
|
||||||
float wr1 = 1.5 - fpx;
|
float wr1 = 1.0 - fpx;
|
||||||
float wr2 = 2.5 - fpx;
|
float wr2 = 2.0 - fpx;
|
||||||
|
float wr3 = 3.0 - fpx;
|
||||||
|
|
||||||
|
wl3*=wl3; wl3 = exp2(-h_sharp*wl3);
|
||||||
wl2*=wl2; wl2 = exp2(-h_sharp*wl2);
|
wl2*=wl2; wl2 = exp2(-h_sharp*wl2);
|
||||||
wl1*=wl1; wl1 = exp2(-h_sharp*wl1);
|
wl1*=wl1; wl1 = exp2(-h_sharp*wl1);
|
||||||
wct*=wct; wct = exp2(-h_sharp*wct);
|
|
||||||
wr1*=wr1; wr1 = exp2(-h_sharp*wr1);
|
wr1*=wr1; wr1 = exp2(-h_sharp*wr1);
|
||||||
wr2*=wr2; wr2 = exp2(-h_sharp*wr2);
|
wr2*=wr2; wr2 = exp2(-h_sharp*wr2);
|
||||||
|
wr3*=wr3; wr3 = exp2(-h_sharp*wr3);
|
||||||
|
|
||||||
float fp1 = 1.-fpx;
|
float fp1 = 1.-fpx;
|
||||||
|
|
||||||
float twl2 = max(wl2 - sharp1, min(mix( -0.09, 0.09, fpx),0.0));
|
float twl3 = max(wl3 - sharp1, 0.0);
|
||||||
float twl1 = max(wl1 - sharp1, mix( -0.275, -0.09, fpx));
|
float twl2 = max(wl2 - sharp1, mix(0.0,mix(-0.17, -0.025, fp.x),float(s_sharp > 0.05)));
|
||||||
float twct = max(wct - sharp1, 0.0);
|
float twl1 = max(wl1 - sharp1, 0.0);
|
||||||
float twr1 = max(wr1 - sharp1, mix( -0.275, -0.09, fp1));
|
float twr1 = max(wr1 - sharp1, 0.0);
|
||||||
float twr2 = max(wr2 - sharp1, min(mix( -0.09, 0.09, fp1),0.0));
|
float twr2 = max(wr2 - sharp1, mix(0.0,mix(-0.17, -0.025, 1.-fp.x),float(s_sharp > 0.05)));
|
||||||
|
float twr3 = max(wr3 - sharp1, 0.0);
|
||||||
|
|
||||||
float wtt = 1.0/(twl2+twl1+twct+twr1+twr2);
|
float wtt = 1.0/(twl3+twl2+twl1+twr1+twr2+twr3);
|
||||||
float wt = 1.0/(wl2+wl1+wct+wr1+wr2);
|
float wt = 1.0/(wl2+wl1+wr1+wr2);
|
||||||
bool sharp = (s_sharp > 0.02);
|
bool sharp = (s_sharp > 0.05);
|
||||||
|
|
||||||
vec3 l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
vec3 l3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
||||||
vec3 l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
vec3 l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
||||||
vec3 ct = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
vec3 l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
||||||
vec3 r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
vec3 r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
||||||
vec3 r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
vec3 r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
||||||
|
vec3 r3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx+off2).xyz;
|
||||||
|
|
||||||
vec3 sl2 = COMPAT_TEXTURE(Texture, pC4 -off2).xyz;
|
vec3 sl2 = COMPAT_TEXTURE(Texture, pC4 -offx).xyz;
|
||||||
vec3 sl1 = COMPAT_TEXTURE(Texture, pC4 -offx).xyz;
|
vec3 sl1 = COMPAT_TEXTURE(Texture, pC4 ).xyz;
|
||||||
vec3 sct = COMPAT_TEXTURE(Texture, pC4 ).xyz;
|
|
||||||
vec3 sr1 = COMPAT_TEXTURE(Texture, pC4 +offx).xyz;
|
vec3 sr1 = COMPAT_TEXTURE(Texture, pC4 +offx).xyz;
|
||||||
vec3 sr2 = COMPAT_TEXTURE(Texture, pC4 +off2).xyz;
|
vec3 sr2 = COMPAT_TEXTURE(Texture, pC4 +off2).xyz;
|
||||||
|
|
||||||
vec3 color1 = clamp((l2*twl2 + l1*twl1 + ct*twct + r1*twr1 + r2*twr2)*wtt,0.0,1.0);
|
vec3 color1 = (l3*twl3 + l2*twl2 + l1*twl1 + r1*twr1 + r2*twr2 + r3*twr3)*wtt;
|
||||||
|
|
||||||
vec3 e2 = l2; if (fpx > 0.5) e2 = r2;
|
vec3 colmin = min(min(l1,r1), min(l2,r2));
|
||||||
vec3 colmin = min(min(l1,r1), min(ct,e2));
|
vec3 colmax = max(max(l1,r1), max(l2,r2));
|
||||||
vec3 colmax = max(max(l1,r1), max(ct,e2));
|
|
||||||
|
|
||||||
if (sharp) color1 = clamp(color1, colmin, colmax);
|
if (sharp) color1 = clamp(color1, colmin, colmax);
|
||||||
|
|
||||||
vec3 gtmp = vec3(gamma_out*0.1);
|
vec3 gtmp = vec3(gamma_out*0.1);
|
||||||
vec3 scolor1 = color1;
|
vec3 scolor1 = color1;
|
||||||
|
|
||||||
scolor1 = (sl2*wl2 + sl1*wl1 + sct*wct + sr1*wr1 + sr2*wr2)*wt;
|
scolor1 = (sl2*wl2 + sl1*wl1 + sr1*wr1 + sr2*wr2)*wt;
|
||||||
scolor1 = pow(scolor1, gtmp); vec3 mcolor1 = scolor1;
|
scolor1 = pow(scolor1, gtmp); vec3 mcolor1 = scolor1;
|
||||||
scolor1 = mix(color1, scolor1, spike);
|
scolor1 = mix(color1, scolor1, spike);
|
||||||
|
|
||||||
pC4+=offy;
|
pC4+=offy;
|
||||||
|
|
||||||
l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
l3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
||||||
l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
||||||
ct = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
||||||
r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
||||||
r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
||||||
|
r3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx+off2).xyz;
|
||||||
|
|
||||||
sl2 = COMPAT_TEXTURE(Texture, pC4 -off2).xyz;
|
sl2 = COMPAT_TEXTURE(Texture, pC4 -offx).xyz;
|
||||||
sl1 = COMPAT_TEXTURE(Texture, pC4 -offx).xyz;
|
sl1 = COMPAT_TEXTURE(Texture, pC4 ).xyz;
|
||||||
sct = COMPAT_TEXTURE(Texture, pC4 ).xyz;
|
|
||||||
sr1 = COMPAT_TEXTURE(Texture, pC4 +offx).xyz;
|
sr1 = COMPAT_TEXTURE(Texture, pC4 +offx).xyz;
|
||||||
sr2 = COMPAT_TEXTURE(Texture, pC4 +off2).xyz;
|
sr2 = COMPAT_TEXTURE(Texture, pC4 +off2).xyz;
|
||||||
|
|
||||||
vec3 color2 = clamp((l2*twl2 + l1*twl1 + ct*twct + r1*twr1 + r2*twr2)*wtt,0.0,1.0);
|
vec3 color2 = (l3*twl3 + l2*twl2 + l1*twl1 + r1*twr1 + r2*twr2 + r3*twr3)*wtt;
|
||||||
|
|
||||||
e2 = l2; if (fpx > 0.5) e2 = r2;
|
colmin = min(min(l1,r1), min(l2,r2));
|
||||||
colmin = min(min(l1,r1), min(ct,e2));
|
colmax = max(max(l1,r1), max(l2,r2));
|
||||||
colmax = max(max(l1,r1), max(ct,e2));
|
|
||||||
|
|
||||||
if (sharp) color2 = clamp(color2, colmin, colmax);
|
if (sharp) color2 = clamp(color2, colmin, colmax);
|
||||||
|
|
||||||
vec3 scolor2 = color2;
|
vec3 scolor2 = color2;
|
||||||
|
|
||||||
scolor2 = (sl2*wl2 + sl1*wl1 + sct*wct + sr1*wr1 + sr2*wr2)*wt;
|
scolor2 = (sl2*wl2 + sl1*wl1 + sr1*wr1 + sr2*wr2)*wt;
|
||||||
scolor2 = pow(scolor2, gtmp); vec3 mcolor2 = scolor2;
|
scolor2 = pow(scolor2, gtmp); vec3 mcolor2 = scolor2;
|
||||||
scolor2 = mix(color2, scolor2, spike);
|
scolor2 = mix(color2, scolor2, spike);
|
||||||
|
|
||||||
|
@ -492,17 +495,17 @@ void main()
|
||||||
{
|
{
|
||||||
pC4-= 2.*offy;
|
pC4-= 2.*offy;
|
||||||
|
|
||||||
l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
l3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -off2).xyz;
|
||||||
l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
l2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 -offx).xyz;
|
||||||
ct = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
l1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 ).xyz;
|
||||||
r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
r1 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx).xyz;
|
||||||
r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
r2 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +off2).xyz;
|
||||||
|
r3 = COMPAT_TEXTURE(PassPrev4Texture, pC4 +offx+off2).xyz;
|
||||||
|
|
||||||
color0 = clamp((l2*twl2 + l1*twl1 + ct*twct + r1*twr1 + r2*twr2)*wtt,0.0,1.0);
|
color0 = (l3*twl3 + l2*twl2 + l1*twl1 + r1*twr1 + r2*twr2 + r3*twr3)*wtt;
|
||||||
|
|
||||||
e2 = l2; if (fpx > 0.5) e2 = r2;
|
colmin = min(min(l1,r1), min(l2,r2));
|
||||||
colmin = min(min(l1,r1), min(ct,e2));
|
colmax = max(max(l1,r1), max(l2,r2));
|
||||||
colmax = max(max(l1,r1), max(ct,e2));
|
|
||||||
|
|
||||||
if (sharp) color0 = clamp(color0, colmin, colmax);
|
if (sharp) color0 = clamp(color0, colmin, colmax);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue