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;
142 uniform
float threshold;
145 float weight(
int x,
int y)
147 return texture2D(convolutionMatrix, vec2(x + .5, y + .5) /
float(convolutionMatrixWidth)).r;
152 vec2 uv = fragmentTextureCoordinate;
154 vec4 colorSum = vec4(0.);
156 for (
int y = 0; y < convolutionMatrixWidth; y++)
157 for (
int x = 0; x < convolutionMatrixWidth; x++)
159 float w = weight(x,y);
160 vec4 color = VuoGlsl_sample(image, uv + vec2(
161 (x - convolutionMatrixWidth/2)/viewportSize.x,
162 (y - convolutionMatrixWidth/2)/viewportSize.y
164 color = VuoGlsl_gray(color, channels) * w;
168 float brightness = VuoGlsl_brightness(colorSum, 0);
169 if (abs(brightness) < threshold)
170 colorSum.rgb = vec3(0.);
172 colorSum.rgb *= intensity;
174 vec4 color = VuoGlsl_sample(image, uv);
177 colorSum.rgb =
clamp(colorSum.rgb / 2. + .5, 0, color.a);
179 colorSum.rgb =
clamp(colorSum.rgb, 0, color.a);
181 colorSum.rgb =
clamp(abs(colorSum.rgb), 0, color.a);
183 gl_FragColor = vec4(colorSum.rgb, color.a);