13 #include <OpenGL/CGLMacro.h>
18 "title" :
"VuoImageConvolve",
52 const double sigma = radius * .6 * sqrt(2);
53 double r2 = x*x + y*y;
55 return -10. / sqrt(2. * M_PI * fmax(1, sigma * sigma * sigma * sigma))
56 * (1. - r2/(2*sigma*sigma))
57 * exp(-r2/(2*sigma*sigma));
69 const double mu_s = 5;
72 const double sigma = radius * .6 * sqrt(2);
74 return 1 + 2 * ceil(mu_s * sigma);
83 int pixelsWide = width | 1;
86 float *pixelFloats = (
float *)malloc(
sizeof(
float) * pixelsWide * pixelsWide);
88 for (
int y = 0; y < pixelsWide; ++y)
89 for (
int x = 0; x < pixelsWide; ++x)
91 float v = f(x - pixelsWide/2, y - pixelsWide/2, param);
92 pixelFloats[y * pixelsWide + x] = v;
98 double offset = sum / (pixelsWide * pixelsWide);
99 for (
int y = 0; y < pixelsWide; ++y)
100 for (
int x = 0; x < pixelsWide; ++x)
101 pixelFloats[y * pixelsWide + x] -= offset;
119 return VuoImage_makeFromBuffer(pixelFloats, GL_LUMINANCE, pixelsWide, pixelsWide, VuoImageColorDepth_32, ^(
void *buffer){ free(pixelFloats); });
131 \n#include
"VuoGlslAlpha.glsl"
132 \n#include
"VuoGlslBrightness.glsl"
134 varying vec2 fragmentTextureCoordinate;
136 uniform sampler2D image;
137 uniform vec2 viewportSize;
138 uniform sampler2D convolutionMatrix;
139 uniform
int convolutionMatrixWidth;
140 uniform
int channels;
141 uniform
float intensity;
144 float weight(
int x,
int y)
146 return texture2D(convolutionMatrix, vec2(x + .5, y + .5) /
float(convolutionMatrixWidth)).r;
151 vec2 uv = fragmentTextureCoordinate;
153 vec4 colorSum = vec4(0.);
155 for (
int y = 0; y < convolutionMatrixWidth; y++)
156 for (
int x = 0; x < convolutionMatrixWidth; x++)
158 float w = weight(x,y);
159 vec4 color = VuoGlsl_sample(image, uv + vec2(
160 (x - convolutionMatrixWidth/2)/viewportSize.x,
161 (y - convolutionMatrixWidth/2)/viewportSize.y
163 color = VuoGlsl_gray(color, channels) * w;
167 colorSum.rgb *= intensity;
169 vec4 color = VuoGlsl_sample(image, uv);
172 colorSum.rgb =
clamp(colorSum.rgb / 2. + .5, 0, color.a);
174 colorSum.rgb =
clamp(colorSum.rgb, 0, color.a);
176 colorSum.rgb =
clamp(abs(colorSum.rgb), 0, color.a);
178 gl_FragColor = vec4(colorSum.rgb, color.a);
200 || convolutionMatrix->pixelsWide != convolutionMatrix->pixelsHigh
201 || !(convolutionMatrix->pixelsWide & 1)
202 || !(convolutionMatrix->pixelsHigh & 1))
216 return convolvedImage;