armory/Shaders/smaa_neighborhood_blend/smaa_neighborhood_blend.frag.glsl
2016-10-25 13:01:20 +02:00

102 lines
3 KiB
GLSL
Executable file

#version 450
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D colorTex;
uniform sampler2D blendTex;
#ifdef _Veloc
uniform sampler2D sveloc;
#endif
uniform vec2 screenSizeInv;
in vec2 texCoord;
in vec4 offset;
out vec4 fragColor;
//-----------------------------------------------------------------------------
// Neighborhood Blending Pixel Shader (Third Pass)
// Conditional move:
// void SMAAMovc(bvec2 cond, inout vec2 variable, vec2 value) {
// /*SMAA_FLATTEN*/ if (cond.x) variable.x = value.x;
// /*SMAA_FLATTEN*/ if (cond.y) variable.y = value.y;
//}
//void SMAAMovc(bvec4 cond, inout vec4 variable, vec4 value) {
// SMAAMovc(cond.xy, variable.xy, value.xy);
// SMAAMovc(cond.zw, variable.zw, value.zw);
//}
vec4 SMAANeighborhoodBlendingPS(vec2 texcoord, vec4 offset/*, sampler2D colorTex, sampler2D blendTex*/
//#if SMAA_REPROJECTION
//, sampler2D velocityTex
//#endif
) {
// Fetch the blending weights for current pixel:
vec4 a;
a.x = texture(blendTex, offset.xy).a; // Right
a.y = texture(blendTex, offset.zw).g; // Top
a.wz = texture(blendTex, texcoord).xz; // Bottom / Left
// Is there any blending weight with a value greater than 0.0?
//SMAA_BRANCH
if (dot(a, vec4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {
vec4 color = textureLod(colorTex, texcoord, 0.0);
//#if SMAA_REPROJECTION
#ifdef _Veloc
vec2 velocity = textureLod(sveloc, texCoord, 0.0).rg;
// Pack velocity into the alpha channel:
color.a = sqrt(5.0 * length(velocity));
#endif
return color;
}
else {
bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)
// Calculate the blending offsets:
vec4 blendingOffset = vec4(0.0, a.y, 0.0, a.w);
vec2 blendingWeight = a.yw;
//SMAAMovc(bvec4(h, h, h, h), blendingOffset, vec4(a.x, 0.0, a.z, 0.0));
if (h) blendingOffset.x = a.x;
if (h) blendingOffset.y = 0.0;
if (h) blendingOffset.z = a.z;
if (h) blendingOffset.w = 0.0;
// SMAAMovc(bvec2(h, h), blendingWeight, a.xz);
if (h) blendingWeight.x = a.x;
if (h) blendingWeight.y = a.z;
blendingWeight /= dot(blendingWeight, vec2(1.0, 1.0));
// Calculate the texture coordinates:
vec4 blendingCoord = blendingOffset * vec4(screenSizeInv.xy, -screenSizeInv.xy) + texcoord.xyxy;
// We exploit bilinear filtering to mix current pixel with the chosen
// neighbor:
vec4 color = blendingWeight.x * textureLod(colorTex, blendingCoord.xy, 0.0);
color += blendingWeight.y * textureLod(colorTex, blendingCoord.zw, 0.0);
//#if SMAA_REPROJECTION
#ifdef _Veloc
// Antialias velocity for proper reprojection in a later stage:
vec2 velocity = blendingWeight.x * textureLod(sveloc, blendingCoord.xy, 0.0).rg;
velocity += blendingWeight.y * textureLod(sveloc, blendingCoord.zw, 0.0).rg;
// Pack velocity into the alpha channel:
color.a = sqrt(5.0 * length(velocity));
#endif
return color;
}
return vec4(0.0);
}
void main() {
fragColor = SMAANeighborhoodBlendingPS(texCoord, offset/*, colorTex, blendTex*/);
}