RibbonUI/lib_source/effects/gaussianblur.frag

42 lines
997 B
GLSL

#version 440
layout(location = 0) in vec2 qt_TexCoord0;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {
mat4 qt_Matrix;
float qt_Opacity;
vec2 pixelStep;
int radius;
float deviation;
};
layout(binding = 1) uniform sampler2D src;
#define PI 3.1415926538
float gaussianWeight(vec2 coords)
{
float x2 = pow(coords.x, 2.0);
float y2 = pow(coords.y, 2.0);
float deviation2 = pow(deviation, 2.0);
return (1.0 / (2.0 * PI * deviation2)) * exp(-(x2 + y2) / (2.0 * deviation2));
}
void main(void)
{
vec4 sum = vec4(0.0);
float gaussianSum = 0.0;
for (int x = -radius; x <= radius; ++x) {
for (int y = -radius; y <= radius; ++y) {
vec2 c = qt_TexCoord0 + vec2(x, y) * pixelStep;
float w = gaussianWeight(vec2(x, y));
vec4 color = texture(src, c);
sum += color * w;
gaussianSum += w;
}
}
fragColor = sum / gaussianSum * qt_Opacity;
}