12 #include "glut_wrap.h"
17 #define TEXTURE_FILE DEMOS_DATA_DIR "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 void usage(char *name
)
26 fprintf(stderr
, "usage: %s [ options ] shader_filename\n", name
);
28 fprintf(stderr
, "\n" );
29 fprintf(stderr
, "options:\n");
30 fprintf(stderr
, " -fps show frames per second\n");
35 void alarmhandler (int sig
)
38 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt
,
43 signal(SIGALRM
, alarmhandler
);
48 static void args(int argc
, char *argv
[])
52 for (i
= 1; i
< argc
; i
++) {
53 if (strcmp(argv
[i
], "-fps") == 0) {
56 else if (i
== argc
- 1) {
71 static void Init( void )
80 if ((f
= fopen(filename
, "r")) == NULL
) {
81 fprintf(stderr
, "Couldn't open %s\n", filename
);
85 sz
= fread(buf
, 1, sizeof(buf
), f
);
87 fprintf(stderr
, "file too long\n");
90 fprintf(stderr
, "%.*s\n", sz
, buf
);
92 if (!GLEW_ARB_fragment_program
) {
93 printf("Error: GL_ARB_fragment_program not supported!\n");
96 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
98 /* Setup the fragment program */
99 glGenProgramsARB(1, &prognum
);
100 glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB
, prognum
);
101 glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB
, GL_PROGRAM_FORMAT_ASCII_ARB
,
102 sz
, (const GLubyte
*)buf
);
104 errnum
= glGetError();
105 printf("glGetError = 0x%x\n", errnum
);
106 if (errnum
!= GL_NO_ERROR
) {
109 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB
, &errorpos
);
110 printf("errorpos: %d\n", errorpos
);
111 printf("glError(GL_PROGRAM_ERROR_STRING_ARB) = %s\n",
112 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB
));
114 glEnable(GL_FRAGMENT_PROGRAM_ARB
);
118 glGenTextures(1, &Texture
);
119 glBindTexture(GL_TEXTURE_2D
, Texture
);
120 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
121 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
122 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
123 if (!LoadRGBMipmaps(TEXTURE_FILE
, GL_RGB
)) {
124 printf("Error: couldn't load texture image file %s\n", TEXTURE_FILE
);
129 glGenTextures(1, &Texture
);
130 glActiveTextureARB(GL_TEXTURE0_ARB
+ 1);
131 glBindTexture(GL_TEXTURE_2D
, Texture
);
132 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
133 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
134 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
137 GLubyte data
[32][32];
143 for (i
= 0; i
< 32; i
++)
144 for (j
= 0; j
< 32; j
++)
157 int i2
= i
- height
/ 2;
158 int j2
= j
- width
/ 2;
161 if ( -h8
<= i2
&& i2
<= h8
&& -w8
<= j2
&& j2
<= w8
) {
163 } else if ( -2 * h8
<= i2
&& i2
<= 2 * h8
&& -2 * w8
<= j2
&& j2
<= 2 * w8
) {
165 } else if ( -3 * h8
<= i2
&& i2
<= 3 * h8
&& -3 * w8
<= j2
&& j2
<= 3 * w8
) {
172 glTexImage2D( GL_TEXTURE_2D
, 0,
175 GL_ALPHA
, GL_UNSIGNED_BYTE
, data
);
180 const float Ambient
[4] = { 0.0, 1.0, 0.0, 0.0 };
181 const float Diffuse
[4] = { 1.0, 0.0, 0.0, 0.0 };
182 const float Specular
[4] = { 0.0, 0.0, 1.0, 0.0 };
183 const float Emission
[4] = { 0.0, 0.0, 0.0, 1.0 };
184 glMaterialfv(GL_FRONT_AND_BACK
, GL_AMBIENT
, Ambient
);
185 glMaterialfv(GL_FRONT_AND_BACK
, GL_DIFFUSE
, Diffuse
);
186 glMaterialfv(GL_FRONT_AND_BACK
, GL_SPECULAR
, Specular
);
187 glMaterialfv(GL_FRONT_AND_BACK
, GL_EMISSION
, Emission
);
190 glClearColor(.1, .3, .5, 0);
194 static void Reshape(int width
, int height
)
197 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
199 glMatrixMode(GL_PROJECTION
);
201 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
202 glMatrixMode(GL_MODELVIEW
);
205 static void Key(unsigned char key
, int x
, int y
)
218 static void Draw(void)
220 glClear(GL_COLOR_BUFFER_BIT
);
222 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB
, 0, 1.0, 1.0, 0.0, 0.0);
223 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB
, 1, 0.0, 0.0, 1.0, 1.0);
224 glBegin(GL_TRIANGLES
);
228 glVertex3f( 0.9, -0.9, -30.0);
231 glTexCoord3f(1,-1,0);
232 glVertex3f( 0.9, 0.9, -30.0);
235 glTexCoord3f(-1,0,0);
236 glVertex3f(-0.9, 0.0, -30.0);
247 int main(int argc
, char **argv
)
249 glutInit(&argc
, argv
);
250 glutInitWindowPosition(0, 0);
251 glutInitWindowSize(250, 250);
252 glutInitDisplayMode(GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
);
254 glutCreateWindow(filename
);
256 glutReshapeFunc(Reshape
);
257 glutKeyboardFunc(Key
);
258 glutDisplayFunc(Draw
);
262 signal(SIGALRM
, alarmhandler
);