New update:

- Added Paint filter.
 - Tweaked order of shaders.
 - Allow more grain parameters to be configured.
This commit is contained in:
Marisa the Magician 2021-11-06 17:25:07 +01:00
commit 595159703c
11 changed files with 259 additions and 67 deletions

View file

@ -24,12 +24,12 @@ void main()
{
vec4 res = texture(InputTexture,TexCoord);
res.rgb = pow(max(res.rgb,0.0),gradepow)*grademul;
float tonev = luminance(res.rgb);
vec3 tonecolor = gradecol*tonev;
res.rgb = res.rgb*(1.0-gradecolfact)+tonecolor*gradecolfact;
vec3 hsv = rgb2hsv(res.rgb);
hsv.y = clamp(pow(max(hsv.y,0.0),gradesatpow)*gradesatmul,0.0,1.0);
hsv.z = pow(max(hsv.z,0.0),gradevalpow)*gradevalmul;
res.rgb = hsv2rgb(hsv);
float tonev = luminance(res.rgb);
vec3 tonecolor = gradecol*tonev;
res.rgb = res.rgb*(1.0-gradecolfact)+tonecolor*gradecolfact;
FragColor = res;
}

View file

@ -2,24 +2,18 @@
Complex grain shader ported over from MariENB
(C)2012-2021 Marisa Kirisame
*/
const float nf = 0.0005;
const vec3 nm1 = vec3(2.05,3.11,2.22);
const float nk = 0.04;
const vec3 nm2 = vec3(4.25,9.42,6.29);
#define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b)))
#define darkmask(a,b) (a>0.5)?(2.0*a*(0.5+b)):(1.0-2.0*(1.0-a)*(1.0-((0.5+b))))
vec3 grain( in vec3 res, in vec2 coord )
{
float ts = Timer*nf;
vec2 s1 = coord+vec2(0.0,ts);
vec2 s2 = coord+vec2(ts,0.0);
vec2 s1 = coord+vec2(0.,ts);
vec2 s2 = coord+vec2(ts,0.);
vec2 s3 = coord+vec2(ts,ts);
float n1, n2, n3;
vec2 bresl = textureSize(InputTexture,0);
vec2 nr = vec2(7.5);
nr.y *= bresl.y/bresl.x;
vec2 nr = bresl/256.;
n1 = texture(NoiseTexture,s1*nm1.x*nr).r;
n2 = texture(NoiseTexture,s2*nm1.y*nr).g;
n3 = texture(NoiseTexture,s3*nm1.z*nr).b;
@ -29,26 +23,27 @@ vec3 grain( in vec3 res, in vec2 coord )
n1 = texture(NoiseTexture,s1*nm2.x*nr).r;
n2 = texture(NoiseTexture,s2*nm2.y*nr).g;
n3 = texture(NoiseTexture,s3*nm2.z*nr).b;
float n4 = (n1+n2+n3)/3.0;
float n4 = (n1+n2+n3)/3.;
vec3 ng = vec3(n4);
vec3 nc = vec3(n1,n2,n3);
vec3 nt = pow(clamp(mix(ng,nc,ns),0.0,1.0),vec3(np));
if ( nb == 0 ) res.rgb += nt*ni;
else if ( nb == 1 )
vec3 nt = pow(clamp(mix(ng,nc,ns),.0,1.),vec3(np));
if ( nb == 1 ) res.rgb += nt*ni;
else if ( nb == 2 )
{
res.r = overlay(res.r,(nt.r*ni+0.5));
res.g = overlay(res.g,(nt.g*ni+0.5));
res.b = overlay(res.b,(nt.b*ni+0.5));
res.r = overlay(res.r,(nt.r*ni));
res.g = overlay(res.g,(nt.g*ni));
res.b = overlay(res.b,(nt.b*ni));
}
else
else if ( nb == 3 )
{
float bn = 1.0-clamp((res.r+res.g+res.b)/3.0,0.0,1.0);
float bn = 1.-clamp((res.r+res.g+res.b)/3.,0.,1.);
bn = pow(bn,bnp);
vec3 nn = clamp(nt*bn,vec3(0.0),vec3(1.0));
vec3 nn = clamp(nt*bn,vec3(0.),vec3(1.));
res.r = darkmask(res.r,(nn.r*ni));
res.g = darkmask(res.g,(nn.g*ni));
res.b = darkmask(res.b,(nn.b*ni));
}
else res.rgb = mix(res.rgb,nt,ni);
return res;
}

View file

@ -0,0 +1,52 @@
/*
Paint filter from MariENB (first pass Kuwahara filter)
(C)2012-2021 Marisa Kirisame
*/
void main()
{
vec2 coord = TexCoord;
vec4 res = texture(InputTexture,coord);
vec2 bresl = textureSize(InputTexture,0);
vec2 bof = 1./bresl;
float n = 16.;
vec3 m[4] = vec3[](vec3(0.),vec3(0.),vec3(0.),vec3(0.)),
s[4] = vec3[](vec3(0.),vec3(0.),vec3(0.),vec3(0.)),
c;
int i, j;
for ( i=-3; i<=0; i++ ) for ( j=-3; j<=0; j++ )
{
c = texture(InputTexture,coord+vec2(i,j)*bof).rgb;
m[0] += c;
s[0] += c*c;
}
for ( i=-3; i<=0; i++ ) for ( j=0; j<=3; j++ )
{
c = texture(InputTexture,coord+vec2(i,j)*bof).rgb;
m[1] += c;
s[1] += c*c;
}
for ( i=0; i<=3; i++ ) for ( j=-3; j<=0; j++ )
{
c = texture(InputTexture,coord+vec2(i,j)*bof).rgb;
m[2] += c;
s[2] += c*c;
}
for ( i=0; i<=3; i++ ) for ( j=0; j<=3; j++ )
{
c = texture(InputTexture,coord+vec2(i,j)*bof).rgb;
m[3] += c;
s[3] += c*c;
}
float min_sigma2 = 1e+2, sigma2;
for ( i=0; i<4; i++ )
{
m[i] /= n;
s[i] = abs(s[i]/n-m[i]*m[i]);
sigma2 = s[i].r+s[i].g+s[i].b;
if ( sigma2 >= min_sigma2 ) continue;
min_sigma2 = sigma2;
res.rgb = m[i];
}
FragColor = res;
}

View file

@ -0,0 +1,33 @@
/*
Paint filter from MariENB (second pass median smoothing)
(C)2012-2021 Marisa Kirisame
*/
#define luminance(x) dot(x,vec3(0.2126,0.7152,0.0722))
void main()
{
vec2 coord = TexCoord;
vec4 res = vec4(1.);
vec2 bresl = textureSize(InputTexture,0);
vec2 bof = 1./bresl;
vec3 m1, m2, m3;
vec3 a, b, c;
a = texture(InputTexture,coord+vec2(-1,-1)*bof).rgb;
b = texture(InputTexture,coord+vec2( 0,-1)*bof).rgb;
c = texture(InputTexture,coord+vec2( 1,-1)*bof).rgb;
m1 = (luminance(a)<luminance(b))?((luminance(b)<luminance(c))?b
:max(a,c)):((luminance(a)<luminance(c))?a:max(b,c));
a = texture(InputTexture,coord+vec2(-1, 0)*bof).rgb;
b = texture(InputTexture,coord+vec2( 0, 0)*bof).rgb;
c = texture(InputTexture,coord+vec2( 1, 0)*bof).rgb;
m2 = (luminance(a)<luminance(b))?((luminance(b)<luminance(c))?b
:max(a,c)):((luminance(a)<luminance(c))?a:max(b,c));
a = texture(InputTexture,coord+vec2(-1, 1)*bof).rgb;
b = texture(InputTexture,coord+vec2( 0, 1)*bof).rgb;
c = texture(InputTexture,coord+vec2( 1, 1)*bof).rgb;
m3 = (luminance(a)<luminance(b))?((luminance(b)<luminance(c))?b
:max(a,c)):((luminance(a)<luminance(c))?a:max(b,c));
res.rgb = (luminance(m1)<luminance(m2))?((luminance(m2)<luminance(m3))
?m2:max(m1,m3)):((luminance(m1)<luminance(m3))?m1:max(m2,m3));
FragColor = res;
}

View file

@ -0,0 +1,38 @@
/*
Paint filter from MariENB (third pass FXAA)
(C)2012-2021 Marisa Kirisame
*/
void main()
{
vec2 coord = TexCoord;
vec4 res = vec4(1.);
vec2 bresl = textureSize(InputTexture,0);
vec2 bof = 1./bresl;
float fxaareducemul = 1./16.;
float fxaareducemin = 1./128.;
float fxaaspanmax = 4.;
vec3 rgbNW = texture(InputTexture,coord+vec2(-1,-1)*bof).rgb;
vec3 rgbNE = texture(InputTexture,coord+vec2(1,-1)*bof).rgb;
vec3 rgbSW = texture(InputTexture,coord+vec2(-1,1)*bof).rgb;
vec3 rgbSE = texture(InputTexture,coord+vec2(1,1)*bof).rgb;
vec3 rgbM = texture(InputTexture,coord).rgb;
vec3 luma = vec3(.299,.587,.114);
float lumaNW = dot(rgbNW,luma);
float lumaNE = dot(rgbNE,luma);
float lumaSW = dot(rgbSW,luma);
float lumaSE = dot(rgbSE,luma);
float lumaM = dot(rgbM,luma);
float lumaMin = min(lumaM,min(min(lumaNW,lumaNE),min(lumaSW,lumaSE)));
float lumaMax = max(lumaM,max(max(lumaNW,lumaNE),max(lumaSW,lumaSE)));
vec2 dir = vec2(-((lumaNW+lumaNE)-(lumaSW+lumaSE)),((lumaNW+lumaSW)-(lumaNE+lumaSE)));
float dirReduce = max((lumaNW+lumaNE+lumaSW+lumaSE)*(.25*fxaareducemul),fxaareducemin);
float rcpDirMin = 1./(min(abs(dir.x),abs(dir.y))+dirReduce);
dir = min(vec2(fxaaspanmax,fxaaspanmax),max(vec2(-fxaaspanmax,-fxaaspanmax),dir*rcpDirMin))/bresl;
vec3 rgbA = (1./2.)*(texture(InputTexture,coord+dir*(1./3.-.5)).rgb+texture(InputTexture,coord+dir*(2./3.-.5)).rgb);
vec3 rgbB = rgbA*(1./2.)+(1./4.)*(texture(InputTexture,coord+dir*(0./3.-.5)).rgb+texture(InputTexture,coord+dir*(3./3.-.5)).rgb);
float lumaB = dot(rgbB,luma);
if ( (lumaB < lumaMin) || (lumaB > lumaMax) ) res.rgb = rgbA;
else res.rgb = rgbB;
FragColor = res;
}