@@ -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[]) |