| @@ -0,0 +1,18 @@ | |||
| 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); | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| 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; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| 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; | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| 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; | |||
| } | |||
| @@ -76,6 +76,52 @@ static void check_link(GLuint prog) | |||
| } | |||
| } | |||
| 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 = | |||
| @@ -103,6 +149,8 @@ static void prepare_shaders() | |||
| glLinkProgram(program); | |||
| check_link(program); | |||
| glUseProgram(program); | |||
| setup_uniforms(); | |||
| } | |||
| static void args(int argc, char *argv[]) | |||