You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.2 KiB
GLSL
59 lines
2.2 KiB
GLSL
// Adapted from:
|
|
// http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
|
|
|
|
#ifdef GL_ES
|
|
precision mediump float;
|
|
precision mediump int;
|
|
#endif
|
|
|
|
#define PROCESSING_TEXTURE_SHADER
|
|
|
|
uniform sampler2D texture;
|
|
|
|
// The inverse of the texture dimensions along X and Y
|
|
uniform vec2 texOffset;
|
|
|
|
varying vec4 vertColor;
|
|
varying vec4 vertTexCoord;
|
|
|
|
uniform int blurSize;
|
|
uniform int horizontalPass; // 0 or 1 to indicate vertical or horizontal pass
|
|
uniform float sigma; // The sigma value for the gaussian function: higher value means more blur
|
|
// A good value for 9x9 is around 3 to 5
|
|
// A good value for 7x7 is around 2.5 to 4
|
|
// A good value for 5x5 is around 2 to 3.5
|
|
// ... play around with this based on what you need :)
|
|
|
|
const float pi = 3.14159265;
|
|
|
|
void main() {
|
|
float numBlurPixelsPerSide = float(blurSize / 2);
|
|
|
|
vec2 blurMultiplyVec = 0 < horizontalPass ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
|
|
|
|
// Incremental Gaussian Coefficent Calculation (See GPU Gems 3 pp. 877 - 889)
|
|
vec3 incrementalGaussian;
|
|
incrementalGaussian.x = 1.0 / (sqrt(2.0 * pi) * sigma);
|
|
incrementalGaussian.y = exp(-0.5 / (sigma * sigma));
|
|
incrementalGaussian.z = incrementalGaussian.y * incrementalGaussian.y;
|
|
|
|
vec4 avgValue = vec4(0.0, 0.0, 0.0, 0.0);
|
|
float coefficientSum = 0.0;
|
|
|
|
// Take the central sample first...
|
|
avgValue += texture2D(texture, vertTexCoord.st) * incrementalGaussian.x;
|
|
coefficientSum += incrementalGaussian.x;
|
|
incrementalGaussian.xy *= incrementalGaussian.yz;
|
|
|
|
// Go through the remaining 8 vertical samples (4 on each side of the center)
|
|
for (float i = 1.0; i <= numBlurPixelsPerSide; i++) {
|
|
avgValue += texture2D(texture, vertTexCoord.st - i * texOffset *
|
|
blurMultiplyVec) * incrementalGaussian.x;
|
|
avgValue += texture2D(texture, vertTexCoord.st + i * texOffset *
|
|
blurMultiplyVec) * incrementalGaussian.x;
|
|
coefficientSum += 2.0 * incrementalGaussian.x;
|
|
incrementalGaussian.xy *= incrementalGaussian.yz;
|
|
}
|
|
|
|
gl_FragColor = avgValue / coefficientSum;
|
|
} |