54 lines
1.3 KiB
GLSL
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;
|
|
}
|