marifx_m/shaders/glsl/mfx_paint_pass3.fp

38 lines
1.6 KiB
GLSL

/*
Paint filter from MariENB (third pass FXAA)
(C)2012-2022 Marisa the Magician
*/
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;
}