--- /dev/null
+const int KernelSize = 8;
+uniform vec2 Offset2f[KernelSize];
+uniform vec4 KernelValue4f[KernelSize];
+
+void main(void)
+{
+ int i;
+ vec4 sum = vec4(0.0);
+ vec4 tmp = gl_Color;
+ vec2 rg, ba;
+ gl_Position = gl_Vertex;
+
+ rg = Offset2f[4];
+ ba = Offset2f[5];
+
+
+ gl_FrontColor = KernelValue4f[0] * vec4(rg, ba);
+}
--- /dev/null
+const int KernelSize = 16;
+uniform float KernelValue1f[KernelSize];
+
+void main(void)
+{
+ int i;
+ vec4 sum = vec4(0.0);
+ vec4 tmp = gl_Color;
+ gl_Position = gl_Vertex;
+
+ for (i = 0; i < KernelSize; ++i) {
+ float x, y, z, w;
+
+ x = KernelValue1f[i]; ++i;
+ y = KernelValue1f[i]; ++i;
+ z = KernelValue1f[i]; ++i;
+ w = KernelValue1f[i];
+
+ sum += tmp * vec4(x, y, z, w);
+ }
+ gl_FrontColor = sum;
+}
--- /dev/null
+const int KernelSize = 9;
+uniform vec2 KernelValue2f[KernelSize];
+
+void main(void)
+{
+ int i;
+ vec4 sum = vec4(0.0);
+ vec4 tmp = gl_Color;
+ gl_Position = gl_Vertex;
+
+ for (i = 0; i < KernelSize; ++i) {
+ vec2 rg, ba;
+
+ rg = KernelValue2f[i];
+ ++i;
+ if (i < KernelSize)
+ ba = KernelValue2f[i];
+ else
+ ba = vec2(0, 0);
+
+ sum += tmp * vec4(rg, ba);
+ }
+ gl_FrontColor = sum;
+}
--- /dev/null
+const int KernelSize = 4;
+uniform vec4 KernelValue4f[KernelSize];
+
+void main(void)
+{
+ int i;
+ vec4 sum = vec4(0.0);
+ vec4 tmp = gl_Color;
+ gl_Position = gl_Vertex;
+
+ for (i = 0; i < KernelSize; ++i) {
+ vec4 rgba;
+
+ rgba = KernelValue4f[i];
+
+ sum += tmp * rgba;
+ }
+ gl_FrontColor = sum;
+}
}
}
+static void setup_uniforms()
+{
+ {
+ GLuint loc1f = glGetUniformLocationARB(program, "Offset1f");
+ GLuint loc2f = glGetUniformLocationARB(program, "Offset2f");
+ GLuint loc4f = glGetUniformLocationARB(program, "Offset4f");
+ GLfloat vecKer[] =
+ { 1.0, 0.0, 0.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 0.0, 0.0, 0.0, 1.0
+ };
+ if (loc1f >= 0)
+ glUniform1fv(loc1f, 16, vecKer);
+
+ if (loc2f >= 0)
+ glUniform2fv(loc2f, 8, vecKer);
+
+ if (loc4f >= 0)
+ glUniform4fv(loc4f, 4, vecKer);
+
+ }
+
+ GLuint loc1f = glGetUniformLocationARB(program, "KernelValue1f");
+ GLuint loc2f = glGetUniformLocationARB(program, "KernelValue2f");
+ GLuint loc4f = glGetUniformLocationARB(program, "KernelValue4f");
+ GLfloat vecKer[] =
+ { 1.0, 0.0, 0.0, 0.25,
+ 0.0, 1.0, 0.0, 0.25,
+ 0.0, 0.0, 1.0, 0.25,
+ 0.0, 0.0, 0.0, 0.25,
+ 0.5, 0.0, 0.0, 0.35,
+ 0.0, 0.5, 0.0, 0.35,
+ 0.0, 0.0, 0.5, 0.35,
+ 0.0, 0.0, 0.0, 0.35
+ };
+ if (loc1f >= 0)
+ glUniform1fv(loc1f, 16, vecKer);
+
+ if (loc2f >= 0)
+ glUniform2fv(loc2f, 8, vecKer);
+
+ if (loc4f >= 0)
+ glUniform4fv(loc4f, 4, vecKer);
+}
+
static void prepare_shaders()
{
static const char *fragShaderText =
glLinkProgram(program);
check_link(program);
glUseProgram(program);
+
+ setup_uniforms();
}
static void args(int argc, char *argv[])