50 lines
1.7 KiB
GLSL
50 lines
1.7 KiB
GLSL
#version 460 core
|
|
|
|
in vec2 vert_texcoord;
|
|
out vec4 frag_color;
|
|
|
|
uniform sampler2D screen;
|
|
|
|
void main() {
|
|
vec3 color = texture(screen, vert_texcoord).rgb;
|
|
|
|
// FXAA implementation
|
|
float FXAA_SPAN_MAX = 32.0;
|
|
float FXAA_REDUCE_MUL = 1.0 / 8.0;
|
|
float FXAA_REDUCE_MIN = 1.0 / 128.0;
|
|
|
|
vec2 inverseRes = 1.0 / vec2(800, 600);
|
|
|
|
vec3 luma = vec3(0.299, 0.587, 0.114);
|
|
|
|
float lumaTL = dot(texture(screen, vert_texcoord + vec2(-1.0, -1.0) * inverseRes).rgb, luma);
|
|
float lumaTR = dot(texture(screen, vert_texcoord + vec2(1.0, -1.0) * inverseRes).rgb, luma);
|
|
float lumaBL = dot(texture(screen, vert_texcoord + vec2(-1.0, 1.0) * inverseRes).rgb, luma);
|
|
float lumaBR = dot(texture(screen, vert_texcoord + vec2(1.0, 1.0) * inverseRes).rgb, luma);
|
|
float lumaM = dot(color, luma);
|
|
|
|
float lumaMin = min(lumaM, min(min(lumaTL, lumaTR), min(lumaBL, lumaBR)));
|
|
float lumaMax = max(lumaM, max(max(lumaTL, lumaTR), max(lumaBL, lumaBR)));
|
|
|
|
vec2 dir;
|
|
dir.x = -((lumaTL + lumaTR) - (lumaBL + lumaBR));
|
|
dir.y = ((lumaTL + lumaBL) - (lumaTR + lumaBR));
|
|
|
|
float dirReduce = max((lumaMax - lumaMin) * FXAA_REDUCE_MUL, FXAA_REDUCE_MIN);
|
|
float inverseDirAdjust = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
|
|
|
|
dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),
|
|
max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),
|
|
dir * inverseDirAdjust)) * inverseRes;
|
|
|
|
vec3 result = 0.5 * (
|
|
texture(screen, vert_texcoord + dir * (1.0 / 3.0 - 0.5)).rgb +
|
|
texture(screen, vert_texcoord + dir * (2.0 / 3.0 - 0.5)).rgb);
|
|
|
|
frag_color = vec4(result, 1.0);
|
|
}
|
|
|
|
|
|
// void main() {
|
|
// frag_color = texture(screen, vert_texcoord);
|
|
// }
|