11 static const char *filename
= NULL
;
12 static GLuint nr_steps
= 4;
14 static GLuint fragShader
;
15 static GLuint vertShader
;
16 static GLuint program
;
18 static void usage( char *name
)
20 fprintf( stderr
, "usage: %s [ options ] shader_filename\n", name
);
21 fprintf( stderr
, "\n" );
22 fprintf( stderr
, "options:\n" );
23 fprintf( stderr
, " -f flat shaded\n" );
24 fprintf( stderr
, " -nNr subdivision steps\n" );
28 static void load_and_compile_shader(GLuint shader
, const char *text
)
32 glShaderSource(shader
, 1, (const GLchar
**) &text
, NULL
);
34 glCompileShader(shader
);
36 glGetShaderiv(shader
, GL_COMPILE_STATUS
, &stat
);
40 glGetShaderInfoLog(shader
, 1000, &len
, log
);
41 fprintf(stderr
, "vp-tris: problem compiling shader:\n%s\n", log
);
46 static void read_shader(GLuint shader
, const char *filename
)
48 const int max
= 100*1000;
50 char *buffer
= (char*) malloc(max
);
51 FILE *f
= fopen(filename
, "r");
53 fprintf(stderr
, "vp-tris: Unable to open shader file %s\n", filename
);
57 n
= fread(buffer
, 1, max
, f
);
58 printf("vp-tris: read %d bytes from shader file %s\n", n
, filename
);
61 load_and_compile_shader(shader
, buffer
);
68 static void check_link(GLuint prog
)
71 glGetProgramiv(prog
, GL_LINK_STATUS
, &stat
);
75 glGetProgramInfoLog(prog
, 1000, &len
, log
);
76 fprintf(stderr
, "Linker error:\n%s\n", log
);
80 static void setup_uniforms()
83 GLuint loc1f
= glGetUniformLocationARB(program
, "Offset1f");
84 GLuint loc2f
= glGetUniformLocationARB(program
, "Offset2f");
85 GLuint loc4f
= glGetUniformLocationARB(program
, "Offset4f");
93 glUniform1fv(loc1f
, 16, vecKer
);
96 glUniform2fv(loc2f
, 8, vecKer
);
99 glUniform4fv(loc4f
, 4, vecKer
);
104 GLuint loc1f
= glGetUniformLocationARB(program
, "KernelValue1f");
105 GLuint loc2f
= glGetUniformLocationARB(program
, "KernelValue2f");
106 GLuint loc4f
= glGetUniformLocationARB(program
, "KernelValue4f");
108 { 1.0, 0.0, 0.0, 0.25,
118 glUniform1fv(loc1f
, 16, vecKer
);
121 glUniform2fv(loc2f
, 8, vecKer
);
124 glUniform4fv(loc4f
, 4, vecKer
);
128 static void prepare_shaders()
130 static const char *fragShaderText
=
132 " gl_FragColor = gl_Color;\n"
134 static const char *vertShaderText
=
136 " gl_FrontColor = gl_Color;\n"
137 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
139 fragShader
= glCreateShader(GL_FRAGMENT_SHADER
);
140 load_and_compile_shader(fragShader
, fragShaderText
);
143 vertShader
= glCreateShader(GL_VERTEX_SHADER
);
145 read_shader(vertShader
, filename
);
147 load_and_compile_shader(vertShader
, vertShaderText
);
149 program
= glCreateProgram();
150 glAttachShader(program
, fragShader
);
151 glAttachShader(program
, vertShader
);
152 glLinkProgram(program
);
154 glUseProgram(program
);
159 static void args(int argc
, char *argv
[])
163 for (i
= 1; i
< argc
; i
++) {
164 if (strncmp(argv
[i
], "-n", 2) == 0) {
165 nr_steps
= atoi((argv
[i
]) + 2);
167 else if (strcmp(argv
[i
], "-f") == 0) {
168 glShadeModel(GL_FLAT
);
170 else if (i
== argc
- 1) {
196 static void make_midpoint( union vert
*out
,
197 const union vert
*v0
,
198 const union vert
*v1
)
201 for (i
= 0; i
< 6; i
++)
202 out
->f
[i
] = v0
->f
[i
] + .5 * (v1
->f
[i
] - v0
->f
[i
]);
205 static void subdiv( union vert
*v0
,
211 glColor3fv(v0
->v
.color
);
212 glVertex3fv(v0
->v
.pos
);
213 glColor3fv(v1
->v
.color
);
214 glVertex3fv(v1
->v
.pos
);
215 glColor3fv(v2
->v
.color
);
216 glVertex3fv(v2
->v
.pos
);
221 make_midpoint(&m
[0], v0
, v1
);
222 make_midpoint(&m
[1], v1
, v2
);
223 make_midpoint(&m
[2], v2
, v0
);
225 subdiv(&m
[0], &m
[2], v0
, depth
-1);
226 subdiv(&m
[1], &m
[0], v1
, depth
-1);
227 subdiv(&m
[2], &m
[1], v2
, depth
-1);
228 subdiv(&m
[0], &m
[1], &m
[2], depth
-1);
233 #define ASSIGN_3V( V, V0, V1, V2 ) \
240 static void Display( void )
242 glClearColor(0.3, 0.3, 0.3, 1);
243 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
245 glUseProgram(program
);
247 glBegin(GL_TRIANGLES
);
253 ASSIGN_3V(v
[0].v
.color
, 0,0,1);
254 ASSIGN_3V(v
[0].v
.pos
, 0.9, -0.9, 0.0);
255 ASSIGN_3V(v
[1].v
.color
, 1,0,0);
256 ASSIGN_3V(v
[1].v
.pos
, 0.9, 0.9, 0.0);
257 ASSIGN_3V(v
[2].v
.color
, 0,1,0);
258 ASSIGN_3V(v
[2].v
.pos
, -0.9, 0, 0.0);
260 subdiv(&v
[0], &v
[1], &v
[2], nr_steps
);
270 static void Reshape( int width
, int height
)
272 glViewport( 0, 0, width
, height
);
273 glMatrixMode( GL_PROJECTION
);
275 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
276 glMatrixMode( GL_MODELVIEW
);
278 /*glTranslatef( 0.0, 0.0, -15.0 );*/
282 static void CleanUp(void)
284 glDeleteShader(fragShader
);
285 glDeleteShader(vertShader
);
286 glDeleteProgram(program
);
289 static void Key( unsigned char key
, int x
, int y
)
302 int main( int argc
, char *argv
[] )
304 glutInit( &argc
, argv
);
305 glutInitWindowPosition( 0, 0 );
306 glutInitWindowSize( 250, 250 );
307 glutInitDisplayMode( GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
308 glutCreateWindow(argv
[0]);
310 glutReshapeFunc( Reshape
);
311 glutKeyboardFunc( Key
);
312 glutDisplayFunc( Display
);