78 lines
2.7 KiB
GLSL
78 lines
2.7 KiB
GLSL
#version 450
|
|
|
|
#ifdef GL_ES
|
|
precision mediump float;
|
|
#endif
|
|
|
|
|
|
uniform sampler2D tex;
|
|
|
|
in vec2 texCoord;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Neighborhood Blending Pixel Shader (Third Pass)
|
|
|
|
float4 SMAANeighborhoodBlendingPS(float2 texcoord,
|
|
float4 offset,
|
|
SMAATexture2D(colorTex),
|
|
SMAATexture2D(blendTex)
|
|
#if SMAA_REPROJECTION
|
|
, SMAATexture2D(velocityTex)
|
|
#endif
|
|
) {
|
|
// Fetch the blending weights for current pixel:
|
|
float4 a;
|
|
a.x = SMAASample(blendTex, offset.xy).a; // Right
|
|
a.y = SMAASample(blendTex, offset.zw).g; // Top
|
|
a.wz = SMAASample(blendTex, texcoord).xz; // Bottom / Left
|
|
|
|
// Is there any blending weight with a value greater than 0.0?
|
|
SMAA_BRANCH
|
|
if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {
|
|
float4 color = SMAASampleLevelZero(colorTex, texcoord);
|
|
|
|
#if SMAA_REPROJECTION
|
|
float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord));
|
|
|
|
// 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:
|
|
float4 blendingOffset = float4(0.0, a.y, 0.0, a.w);
|
|
float2 blendingWeight = a.yw;
|
|
SMAAMovc(bool4(h, h, h, h), blendingOffset, float4(a.x, 0.0, a.z, 0.0));
|
|
SMAAMovc(bool2(h, h), blendingWeight, a.xz);
|
|
blendingWeight /= dot(blendingWeight, float2(1.0, 1.0));
|
|
|
|
// Calculate the texture coordinates:
|
|
float4 blendingCoord = mad(blendingOffset, float4(SMAA_RT_METRICS.xy, -SMAA_RT_METRICS.xy), texcoord.xyxy);
|
|
|
|
// We exploit bilinear filtering to mix current pixel with the chosen
|
|
// neighbor:
|
|
float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);
|
|
color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);
|
|
|
|
#if SMAA_REPROJECTION
|
|
// Antialias velocity for proper reprojection in a later stage:
|
|
float2 velocity = blendingWeight.x * SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, blendingCoord.xy));
|
|
velocity += blendingWeight.y * SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, blendingCoord.zw));
|
|
|
|
// Pack velocity into the alpha channel:
|
|
color.a = sqrt(5.0 * length(velocity));
|
|
#endif
|
|
|
|
return color;
|
|
}
|
|
}
|
|
|
|
|
|
void main() {
|
|
// gl_FragColor = vec4(col);
|
|
}
|