Files
2026-08-20 19:12:08 -04:00

54 lines
1.3 KiB
GLSL

#version 330 core
in vec2 i_uv_out;
out vec4 o_fragColor;
uniform sampler2D u_texture;
uniform vec4 u_tint;
uniform vec3 u_color_offset;
uniform float uIntensity;
uniform float u_intensity;
const int RADIUS = 4;
float gaussianWeight(vec2 offset, float sigma)
{
float dist = dot(offset, offset);
return exp(-dist / (2.0 * sigma * sigma));
}
void main()
{
float intensity = max(max(uIntensity, u_intensity), 0.0);
vec2 texelSize = 1.0 / vec2(textureSize(u_texture, 0));
if (intensity <= 0.001) {
vec4 texColor = texture(u_texture, i_uv_out);
texColor *= u_tint;
texColor.rgb += u_color_offset;
o_fragColor = texColor;
return;
}
float sigma = max(intensity * 2.0, 0.001);
vec4 color = vec4(0.0);
float totalWeight = 0.0;
for (int y = -RADIUS; y <= RADIUS; ++y) {
for (int x = -RADIUS; x <= RADIUS; ++x) {
vec2 kernelOffset = vec2(float(x), float(y));
float weight = gaussianWeight(kernelOffset, sigma);
vec2 sampleOffset = kernelOffset * texelSize * intensity;
color += texture(u_texture, i_uv_out + sampleOffset) * weight;
totalWeight += weight;
}
}
vec4 texColor = color / totalWeight;
texColor *= u_tint;
texColor.rgb += u_color_offset;
o_fragColor = texColor;
}