9108d3f1978f5f9dbe2fd8e5b9b972d43ab180c0
7 #define GL_GLEXT_PROTOTYPES
10 static const char *filename
= NULL
;
11 static GLuint nr_steps
= 4;
13 static GLuint fragShader
;
14 static GLuint vertShader
;
15 static GLuint program
;
17 static void usage( char *name
)
19 fprintf( stderr
, "usage: %s [ options ] shader_filename\n", name
);
20 fprintf( stderr
, "\n" );
21 fprintf( stderr
, "options:\n" );
22 fprintf( stderr
, " -f flat shaded\n" );
23 fprintf( stderr
, " -nNr subdivision steps\n" );
27 static void load_and_compile_shader(GLuint shader
, const char *text
)
31 glShaderSource(shader
, 1, (const GLchar
**) &text
, NULL
);
33 glCompileShader(shader
);
35 glGetShaderiv(shader
, GL_COMPILE_STATUS
, &stat
);
39 glGetShaderInfoLog(shader
, 1000, &len
, log
);
40 fprintf(stderr
, "vp-tris: problem compiling shader:\n%s\n", log
);
45 static void read_shader(GLuint shader
, const char *filename
)
47 const int max
= 100*1000;
49 char *buffer
= (char*) malloc(max
);
50 FILE *f
= fopen(filename
, "r");
52 fprintf(stderr
, "vp-tris: Unable to open shader file %s\n", filename
);
56 n
= fread(buffer
, 1, max
, f
);
57 printf("vp-tris: read %d bytes from shader file %s\n", n
, filename
);
60 load_and_compile_shader(shader
, buffer
);
67 static void check_link(GLuint prog
)
70 glGetProgramiv(prog
, GL_LINK_STATUS
, &stat
);
74 glGetProgramInfoLog(prog
, 1000, &len
, log
);
75 fprintf(stderr
, "Linker error:\n%s\n", log
);
79 static void setup_uniforms()
82 GLuint loc1f
= glGetUniformLocationARB(program
, "Offset1f");
83 GLuint loc2f
= glGetUniformLocationARB(program
, "Offset2f");
84 GLuint loc4f
= glGetUniformLocationARB(program
, "Offset4f");
92 glUniform1fv(loc1f
, 16, vecKer
);
95 glUniform2fv(loc2f
, 8, vecKer
);
98 glUniform4fv(loc4f
, 4, vecKer
);
102 GLuint loc1f
= glGetUniformLocationARB(program
, "KernelValue1f");
103 GLuint loc2f
= glGetUniformLocationARB(program
, "KernelValue2f");
104 GLuint loc4f
= glGetUniformLocationARB(program
, "KernelValue4f");
106 { 1.0, 0.0, 0.0, 0.25,
116 glUniform1fv(loc1f
, 16, vecKer
);
119 glUniform2fv(loc2f
, 8, vecKer
);
122 glUniform4fv(loc4f
, 4, vecKer
);
125 static void prepare_shaders()
127 static const char *fragShaderText
=
129 " gl_FragColor = gl_Color;\n"
131 static const char *vertShaderText
=
133 " gl_FrontColor = gl_Color;\n"
134 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
136 fragShader
= glCreateShader(GL_FRAGMENT_SHADER
);
137 load_and_compile_shader(fragShader
, fragShaderText
);
140 vertShader
= glCreateShader(GL_VERTEX_SHADER
);
142 read_shader(vertShader
, filename
);
144 load_and_compile_shader(vertShader
, vertShaderText
);
146 program
= glCreateProgram();
147 glAttachShader(program
, fragShader
);
148 glAttachShader(program
, vertShader
);
149 glLinkProgram(program
);
151 glUseProgram(program
);
156 static void args(int argc
, char *argv
[])
160 for (i
= 1; i
< argc
; i
++) {
161 if (strncmp(argv
[i
], "-n", 2) == 0) {
162 nr_steps
= atoi((argv
[i
]) + 2);
164 else if (strcmp(argv
[i
], "-f") == 0) {
165 glShadeModel(GL_FLAT
);
167 else if (i
== argc
- 1) {
193 static void make_midpoint( union vert
*out
,
194 const union vert
*v0
,
195 const union vert
*v1
)
198 for (i
= 0; i
< 6; i
++)
199 out
->f
[i
] = v0
->f
[i
] + .5 * (v1
->f
[i
] - v0
->f
[i
]);
202 static void subdiv( union vert
*v0
,
208 glColor3fv(v0
->v
.color
);
209 glVertex3fv(v0
->v
.pos
);
210 glColor3fv(v1
->v
.color
);
211 glVertex3fv(v1
->v
.pos
);
212 glColor3fv(v2
->v
.color
);
213 glVertex3fv(v2
->v
.pos
);
218 make_midpoint(&m
[0], v0
, v1
);
219 make_midpoint(&m
[1], v1
, v2
);
220 make_midpoint(&m
[2], v2
, v0
);
222 subdiv(&m
[0], &m
[2], v0
, depth
-1);
223 subdiv(&m
[1], &m
[0], v1
, depth
-1);
224 subdiv(&m
[2], &m
[1], v2
, depth
-1);
225 subdiv(&m
[0], &m
[1], &m
[2], depth
-1);
230 #define ASSIGN_3V( V, V0, V1, V2 ) \
237 static void Display( void )
239 glClearColor(0.3, 0.3, 0.3, 1);
240 glClear( GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
242 glUseProgram(program
);
244 glBegin(GL_TRIANGLES
);
250 ASSIGN_3V(v
[0].v
.color
, 0,0,1);
251 ASSIGN_3V(v
[0].v
.pos
, 0.9, -0.9, 0.0);
252 ASSIGN_3V(v
[1].v
.color
, 1,0,0);
253 ASSIGN_3V(v
[1].v
.pos
, 0.9, 0.9, 0.0);
254 ASSIGN_3V(v
[2].v
.color
, 0,1,0);
255 ASSIGN_3V(v
[2].v
.pos
, -0.9, 0, 0.0);
257 subdiv(&v
[0], &v
[1], &v
[2], nr_steps
);
267 static void Reshape( int width
, int height
)
269 glViewport( 0, 0, width
, height
);
270 glMatrixMode( GL_PROJECTION
);
272 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
273 glMatrixMode( GL_MODELVIEW
);
275 /*glTranslatef( 0.0, 0.0, -15.0 );*/
279 static void CleanUp(void)
281 glDeleteShader(fragShader
);
282 glDeleteShader(vertShader
);
283 glDeleteProgram(program
);
286 static void Key( unsigned char key
, int x
, int y
)
299 int main( int argc
, char *argv
[] )
301 glutInit( &argc
, argv
);
302 glutInitWindowPosition( 0, 0 );
303 glutInitWindowSize( 250, 250 );
304 glutInitDisplayMode( GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
305 glutCreateWindow(argv
[0]);
306 glutReshapeFunc( Reshape
);
307 glutKeyboardFunc( Key
);
308 glutDisplayFunc( Display
);