17 #define TEXTURE_FILE "../images/bw.rgb"
19 unsigned show_fps
= 0;
20 unsigned int frame_cnt
= 0;
21 void alarmhandler(int);
22 static const char *filename
= NULL
;
24 static GLuint fragShader
;
25 static GLuint vertShader
;
26 static GLuint program
;
29 static void usage(char *name
)
31 fprintf(stderr
, "usage: %s [ options ] shader_filename\n", name
);
33 fprintf(stderr
, "\n" );
34 fprintf(stderr
, "options:\n");
35 fprintf(stderr
, " -fps show frames per second\n");
40 void alarmhandler (int sig
)
43 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt
,
48 signal(SIGALRM
, alarmhandler
);
56 static void load_and_compile_shader(GLuint shader
, const char *text
)
60 glShaderSource(shader
, 1, (const GLchar
**) &text
, NULL
);
62 glCompileShader(shader
);
64 glGetShaderiv(shader
, GL_COMPILE_STATUS
, &stat
);
68 glGetShaderInfoLog(shader
, 1000, &len
, log
);
69 fprintf(stderr
, "fp-tri: problem compiling shader:\n%s\n", log
);
74 static void read_shader(GLuint shader
, const char *filename
)
76 const int max
= 100*1000;
78 char *buffer
= (char*) malloc(max
);
79 FILE *f
= fopen(filename
, "r");
81 fprintf(stderr
, "fp-tri: Unable to open shader file %s\n", filename
);
85 n
= fread(buffer
, 1, max
, f
);
86 printf("fp-tri: read %d bytes from shader file %s\n", n
, filename
);
89 load_and_compile_shader(shader
, buffer
);
96 static void check_link(GLuint prog
)
99 glGetProgramiv(prog
, GL_LINK_STATUS
, &stat
);
103 glGetProgramInfoLog(prog
, 1000, &len
, log
);
104 fprintf(stderr
, "Linker error:\n%s\n", log
);
108 static void setup_uniforms()
111 GLint loc1f
= glGetUniformLocationARB(program
, "Offset1f");
112 GLint loc2f
= glGetUniformLocationARB(program
, "Offset2f");
113 GLint loc4f
= glGetUniformLocationARB(program
, "Offset4f");
115 { 1.0, 0.0, 0.0, 1.0,
121 glUniform1fv(loc1f
, 16, vecKer
);
124 glUniform2fv(loc2f
, 8, vecKer
);
127 glUniform4fv(loc4f
, 4, vecKer
);
132 GLint loc1f
= glGetUniformLocationARB(program
, "KernelValue1f");
133 GLint loc2f
= glGetUniformLocationARB(program
, "KernelValue2f");
134 GLint loc4f
= glGetUniformLocationARB(program
, "KernelValue4f");
136 { 1.0, 0.0, 0.0, 0.25,
146 glUniform1fv(loc1f
, 16, vecKer
);
149 glUniform2fv(loc2f
, 8, vecKer
);
152 glUniform4fv(loc4f
, 4, vecKer
);
156 static void prepare_shaders()
158 static const char *fragShaderText
=
160 " gl_FragColor = gl_Color;\n"
162 static const char *vertShaderText
=
164 " gl_FrontColor = gl_Color;\n"
165 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
167 fragShader
= glCreateShader(GL_FRAGMENT_SHADER
);
169 read_shader(fragShader
, filename
);
171 load_and_compile_shader(fragShader
, fragShaderText
);
174 vertShader
= glCreateShader(GL_VERTEX_SHADER
);
175 load_and_compile_shader(vertShader
, vertShaderText
);
177 program
= glCreateProgram();
178 glAttachShader(program
, fragShader
);
179 glAttachShader(program
, vertShader
);
180 glLinkProgram(program
);
182 glUseProgram(program
);
188 #define SIZE (1<<LEVELS)
189 static int TexWidth
= SIZE
, TexHeight
= SIZE
;
193 ResetTextureLevel( int i
)
195 GLubyte tex2d
[SIZE
*SIZE
][4];
198 GLint Width
= TexWidth
/ (1 << i
);
199 GLint Height
= TexHeight
/ (1 << i
);
202 for (s
= 0; s
< Width
; s
++) {
203 for (t
= 0; t
< Height
; t
++) {
204 tex2d
[t
*Width
+s
][0] = ((s
/ 16) % 2) ? 0 : 255;
205 tex2d
[t
*Width
+s
][1] = ((t
/ 16) % 2) ? 0 : 255;
206 tex2d
[t
*Width
+s
][2] = 128;
207 tex2d
[t
*Width
+s
][3] = 255;
211 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
213 glTexImage2D(GL_TEXTURE_2D
, i
, GL_RGB
, Width
, Height
, 0,
214 GL_RGBA
, GL_UNSIGNED_BYTE
, tex2d
);
224 for (i
= 0; i
<= LEVELS
; i
++)
226 ResetTextureLevel(i
);
230 static void Init( void )
235 glGenTextures(1, &Texture
);
236 glBindTexture(GL_TEXTURE_2D
, Texture
);
237 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
238 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
239 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
240 if (!LoadRGBMipmaps(TEXTURE_FILE
, GL_RGB
)) {
241 printf("Error: couldn't load texture image file %s\n", TEXTURE_FILE
);
246 glGenTextures(1, &Texture
);
247 glActiveTextureARB(GL_TEXTURE0_ARB
+ 1);
248 glBindTexture(GL_TEXTURE_2D
, Texture
);
249 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
250 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
251 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
254 GLubyte data
[32][32];
260 for (i
= 0; i
< 32; i
++)
261 for (j
= 0; j
< 32; j
++)
274 int i2
= i
- height
/ 2;
275 int j2
= j
- width
/ 2;
278 if ( -h8
<= i2
&& i2
<= h8
&& -w8
<= j2
&& j2
<= w8
) {
280 } else if ( -2 * h8
<= i2
&& i2
<= 2 * h8
&& -2 * w8
<= j2
&& j2
<= 2 * w8
) {
282 } else if ( -3 * h8
<= i2
&& i2
<= 3 * h8
&& -3 * w8
<= j2
&& j2
<= 3 * w8
) {
289 glTexImage2D( GL_TEXTURE_2D
, 0,
292 GL_ALPHA
, GL_UNSIGNED_BYTE
, data
);
295 glGenTextures(1, &Texture
);
296 glActiveTextureARB(GL_TEXTURE0_ARB
+ 2);
297 glBindTexture(GL_TEXTURE_2D
, Texture
);
298 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST_MIPMAP_NEAREST
);
299 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
300 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
303 glClearColor(.1, .3, .5, 0);
309 static void args(int argc
, char *argv
[])
313 for (i
= 1; i
< argc
; i
++) {
314 if (strcmp(argv
[i
], "-fps") == 0) {
317 else if (i
== argc
- 1) {
331 static void Reshape(int width
, int height
)
334 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
336 glMatrixMode(GL_PROJECTION
);
338 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
339 glMatrixMode(GL_MODELVIEW
);
342 static void CleanUp(void)
344 glDeleteShader(fragShader
);
345 glDeleteShader(vertShader
);
346 glDeleteProgram(program
);
349 static void Key(unsigned char key
, int x
, int y
)
363 static void Display(void)
365 glClear(GL_COLOR_BUFFER_BIT
);
367 glUseProgram(program
);
368 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB
, 0, 1.0, 1.0, 0.0, 0.0);
369 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB
, 1, 0.0, 0.0, 1.0, 1.0);
370 glBegin(GL_TRIANGLES
);
374 glVertex3f( 0.9, -0.9, -30.0);
377 glTexCoord3f(1,-1,0);
378 glVertex3f( 0.9, 0.9, -30.0);
381 glTexCoord3f(-1,0,0);
382 glVertex3f(-0.9, 0.0, -30.0);
393 int main(int argc
, char **argv
)
395 glutInit(&argc
, argv
);
396 glutInitWindowPosition(0, 0);
397 glutInitWindowSize(250, 250);
398 glutInitDisplayMode(GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
400 glutCreateWindow(filename
? filename
: "fp-tri");
402 glutReshapeFunc(Reshape
);
403 glutKeyboardFunc(Key
);
404 glutDisplayFunc(Display
);
409 signal(SIGALRM
, alarmhandler
);