#include uniform vec2 uResolution; uniform vec2 uTexel; uniform sampler2D uTexture; out vec4 fragColor; float luma(vec3 color) { return dot(color, vec3(0.299, 0.587, 0.114)); } void main() { vec2 uv = FlutterFragCoord().xy / uResolution; vec4 centerSample = texture(uTexture, uv); vec3 sampleN = texture(uTexture, uv + vec2(0.0, -uTexel.y)).rgb; vec3 sampleS = texture(uTexture, uv + vec2(0.0, uTexel.y)).rgb; vec3 sampleE = texture(uTexture, uv + vec2(uTexel.x, 0.0)).rgb; vec3 sampleW = texture(uTexture, uv + vec2(-uTexel.x, 0.0)).rgb; float lumaCenter = luma(centerSample.rgb); float lumaMin = min( lumaCenter, min(min(luma(sampleN), luma(sampleS)), min(luma(sampleE), luma(sampleW))) ); float lumaMax = max( lumaCenter, max(max(luma(sampleN), luma(sampleS)), max(luma(sampleE), luma(sampleW))) ); float edgeSpan = max(lumaMax - lumaMin, 0.0001); float edgeAmount = smoothstep(0.03, 0.18, edgeSpan); vec3 neighborhoodAvg = (sampleN + sampleS + sampleE + sampleW) * 0.25; vec3 aaColor = mix(centerSample.rgb, neighborhoodAvg, edgeAmount * 0.45); vec2 centered = uv - 0.5; float vignette = 1.0 - dot(centered, centered) * 0.35; vignette = clamp(vignette, 0.75, 1.0); vec3 color = aaColor * vignette; fragColor = vec4(color, centerSample.a); }