46 lines
1.1 KiB
GLSL
46 lines
1.1 KiB
GLSL
#version 330
|
|
|
|
#define MAX_KERNEL_RADIUS 16
|
|
#define MAX_KERNEL_COEFFS 2*MAX_KERNEL_RADIUS + 1
|
|
|
|
// Input vertex attributes (from vertex shader)
|
|
in vec2 fragTexCoord;
|
|
in vec4 fragColor;
|
|
|
|
// Input uniform values
|
|
uniform sampler2D texture0;
|
|
uniform vec4 colDiffuse;
|
|
|
|
uniform vec2 textureSize;
|
|
|
|
uniform float coeffs[MAX_KERNEL_COEFFS];
|
|
uniform int kernelRadius;
|
|
uniform vec2 kernelDirection;
|
|
|
|
// Output fragment color
|
|
out vec4 finalColor;
|
|
|
|
void main()
|
|
{
|
|
vec2 texel = 1.0 / textureSize;
|
|
|
|
vec4 texelColor = vec4(0);
|
|
float alphaCorrection = 0;
|
|
|
|
for (int i = 0; i < 2*kernelRadius + 1; i++)
|
|
{
|
|
vec2 offset = kernelDirection * vec2(i - kernelRadius, i - kernelRadius) * texel;
|
|
vec2 sampleCoord = fragTexCoord + offset;
|
|
|
|
if ((0 <= sampleCoord.x && sampleCoord.x <= 1) && (0 <= sampleCoord.y && sampleCoord.y <= 1)) {
|
|
vec4 sample = texture(texture0, sampleCoord);
|
|
texelColor += sample * coeffs[i];
|
|
alphaCorrection += sample.a * coeffs[i];
|
|
}
|
|
}
|
|
|
|
texelColor /= alphaCorrection;
|
|
|
|
finalColor = texelColor * colDiffuse * fragColor;
|
|
}
|