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