102 lines
3.1 KiB
Plaintext
102 lines
3.1 KiB
Plaintext
|
#version 410 compatibility
|
||
|
#define SMAA_PIXEL_SIZE vec2(1.0 / 512.0, 1.0 / 512.0)
|
||
|
|
||
|
#define SMAA_THRESHOLD 0.05
|
||
|
#define SMAA_MAX_SEARCH_STEPS 32
|
||
|
#define SMAA_MAX_SEARCH_STEPS_DIAG 16
|
||
|
#define SMAA_CORNER_ROUNDING 25
|
||
|
|
||
|
|
||
|
#ifndef SMAA_DEPTH_THRESHOLD
|
||
|
#define SMAA_DEPTH_THRESHOLD (0.1 * SMAA_THRESHOLD)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef SMAA_REPROJECTION
|
||
|
#define SMAA_REPROJECTION 0
|
||
|
#endif
|
||
|
|
||
|
#define SMAA_REPROJECTION_WEIGHT_SCALE 30.0
|
||
|
|
||
|
|
||
|
#ifndef SMAA_AREATEX_MAX_DISTANCE
|
||
|
#define SMAA_AREATEX_MAX_DISTANCE 16
|
||
|
#endif
|
||
|
#ifndef SMAA_AREATEX_MAX_DISTANCE_DIAG
|
||
|
#define SMAA_AREATEX_MAX_DISTANCE_DIAG 20
|
||
|
#endif
|
||
|
#define SMAA_AREATEX_PIXEL_SIZE (1.0 / vec2(160.0, 560.0))
|
||
|
#define SMAA_AREATEX_SUBTEX_SIZE (1.0 / 7.0)
|
||
|
|
||
|
|
||
|
/* --- Define section is over ---- */
|
||
|
|
||
|
vec4 SMAANeighborhoodBlendingPS(vec2 texcoord,
|
||
|
vec4 offset[2],
|
||
|
sampler2D colorTex,
|
||
|
sampler2D blendTex) {
|
||
|
// Fetch the blending weights for current pixel:
|
||
|
vec4 a;
|
||
|
a.xz = texture(blendTex, texcoord).xz;
|
||
|
a.y = texture(blendTex, offset[1].zw).g;
|
||
|
a.w = texture(blendTex, offset[1].xy).a;
|
||
|
|
||
|
// 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)
|
||
|
return textureLod(colorTex, texcoord, 0.0);
|
||
|
else {
|
||
|
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
|
||
|
|
||
|
// Up to 4 lines can be crossing a pixel (one through each edge). We
|
||
|
// favor blending by choosing the line with the maximum weight for each
|
||
|
// direction:
|
||
|
vec2 offset;
|
||
|
offset.x = a.a > a.b? a.a : -a.b; // left vs. right
|
||
|
offset.y = a.g > a.r? a.g : -a.r; // top vs. bottom
|
||
|
|
||
|
// Then we go in the direction that has the maximum weight:
|
||
|
if (abs(offset.x) > abs(offset.y)) // horizontal vs. vertical
|
||
|
offset.y = 0.0;
|
||
|
else
|
||
|
offset.x = 0.0;
|
||
|
|
||
|
#if SMAA_REPROJECTION == 1
|
||
|
// Fetch the opposite color and lerp by hand:
|
||
|
vec4 C = textureLod(colorTex, texcoord, 0.0);
|
||
|
texcoord += sign(offset) * SMAA_PIXEL_SIZE;
|
||
|
vec4 Cop = textureLod(colorTex, texcoord, 0.0);
|
||
|
float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
|
||
|
|
||
|
// Unpack the velocity values:
|
||
|
C.a *= C.a;
|
||
|
Cop.a *= Cop.a;
|
||
|
|
||
|
// Lerp the colors:
|
||
|
vec4 Caa = mix(C, Cop, s);
|
||
|
|
||
|
// Unpack velocity and return the resulting value:
|
||
|
Caa.a = sqrt(Caa.a);
|
||
|
return Caa;
|
||
|
#else
|
||
|
// Fetch the opposite color and lerp by hand:
|
||
|
vec4 C = textureLod(colorTex, texcoord, 0.0);
|
||
|
texcoord += sign(offset) * SMAA_PIXEL_SIZE;
|
||
|
vec4 Cop = textureLod(colorTex, texcoord, 0.0);
|
||
|
float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
|
||
|
return mix(C, Cop, s);
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* ------------- Header is over -------------- */
|
||
|
|
||
|
uniform sampler2D albedo_tex;
|
||
|
uniform sampler2D blend_tex;
|
||
|
in vec2 texcoord;
|
||
|
in vec4 offset[2];
|
||
|
in vec4 dummy2;
|
||
|
void main()
|
||
|
{
|
||
|
gl_FragColor = SMAANeighborhoodBlendingPS(texcoord, offset, albedo_tex, blend_tex);
|
||
|
}
|