44 lines
1.3 KiB
GLSL
44 lines
1.3 KiB
GLSL
#include <flutter/runtime_effect.glsl>
|
|
|
|
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);
|
|
}
|