123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // 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;
- }
|