karts/screenspace.frag.glsl
2025-02-16 11:28:18 +13:00

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);
// }