2 * Test shadow2DRectProj() and shadow2D() functions.
7 #define GL_GLEXT_PROTOTYPES
20 /** Use GL_RECTANGLE texture (with projective texcoords)? */
26 static char *FragProgFile
= NULL
;
27 static char *VertProgFile
= NULL
;
29 static GLuint fragShader
;
30 static GLuint vertShader
;
31 static GLuint program
;
33 static GLint uTexture2D
;
34 static GLint uTextureRect
;
38 static GLenum Filter
= GL_LINEAR
;
43 GLenum err
= glGetError();
45 printf("GL Error %s (0x%x) at line %d\n",
46 gluErrorString(err
), (int) err
, line
);
52 PrintString(const char *s
)
55 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
65 glClear(GL_COLOR_BUFFER_BIT
);
70 glUseProgram_func(program
);
75 /* scale coords by two to test projection */
76 glTexCoord4f( 0, 0, 0, 2.0); glVertex2f(-1, -1);
77 glTexCoord4f(2*TEXSIZE
, 0, 2*1, 2.0); glVertex2f( 1, -1);
78 glTexCoord4f(2*TEXSIZE
, 2*TEXSIZE
, 2*1, 2.0); glVertex2f( 1, 1);
79 glTexCoord4f( 0, 2*TEXSIZE
, 0, 2.0); glVertex2f(-1, 1);
81 glTexCoord3f(0, 0, 0); glVertex2f(-1, -1);
82 glTexCoord3f(1, 0, 1); glVertex2f( 1, -1);
83 glTexCoord3f(1, 1, 1); glVertex2f( 1, 1);
84 glTexCoord3f(0, 1, 0); glVertex2f(-1, 1);
91 glWindowPos2iARB(80, 20);
92 PrintString("white black white black");
99 Reshape(int width
, int height
)
101 glViewport(0, 0, width
, height
);
102 glMatrixMode(GL_PROJECTION
);
104 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
105 glMatrixMode(GL_MODELVIEW
);
107 glTranslatef(0.0f
, 0.0f
, -8.0f
);
114 glDeleteShader_func(fragShader
);
115 glDeleteShader_func(vertShader
);
116 glDeleteProgram_func(program
);
117 glutDestroyWindow(win
);
122 Key(unsigned char key
, int x
, int y
)
140 GLfloat image
[TEXSIZE
][TEXSIZE
];
143 for (i
= 0; i
< TEXSIZE
; i
++) {
144 for (j
= 0; j
< TEXSIZE
; j
++) {
145 if (j
< (TEXSIZE
/ 2)) {
154 glActiveTexture(GL_TEXTURE0
); /* unit 0 */
155 glBindTexture(GL_TEXTURE_2D
, 42);
156 glTexImage2D(GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
, TEXSIZE
, TEXSIZE
, 0,
157 GL_DEPTH_COMPONENT
, GL_FLOAT
, image
);
158 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
159 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, Filter
);
160 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, Filter
);
161 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_MODE_ARB
,
162 GL_COMPARE_R_TO_TEXTURE_ARB
);
163 CheckError(__LINE__
);
165 glActiveTexture(GL_TEXTURE1
); /* unit 1 */
166 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, 43);
167 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, GL_DEPTH_COMPONENT
,
168 TEXSIZE
, 10, 0,/*16x10*/
169 GL_DEPTH_COMPONENT
, GL_FLOAT
, image
);
170 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, Filter
);
171 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MAG_FILTER
, Filter
);
172 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_COMPARE_MODE_ARB
,
173 GL_COMPARE_R_TO_TEXTURE_ARB
);
174 CheckError(__LINE__
);
179 LoadAndCompileShader(GLuint shader
, const char *text
)
182 glShaderSource_func(shader
, 1, (const GLchar
**) &text
, NULL
);
183 glCompileShader_func(shader
);
184 glGetShaderiv_func(shader
, GL_COMPILE_STATUS
, &stat
);
188 glGetShaderInfoLog_func(shader
, 1000, &len
, log
);
189 fprintf(stderr
, "fslight: problem compiling shader:\n%s\n", log
);
196 * Read a shader from a file.
199 ReadShader(GLuint shader
, const char *filename
)
201 const int max
= 100*1000;
203 char *buffer
= (char*) malloc(max
);
204 FILE *f
= fopen(filename
, "r");
206 fprintf(stderr
, "fslight: Unable to open shader file %s\n", filename
);
210 n
= fread(buffer
, 1, max
, f
);
211 printf("fslight: read %d bytes from shader file %s\n", n
, filename
);
214 LoadAndCompileShader(shader
, buffer
);
223 CheckLink(GLuint prog
)
226 glGetProgramiv_func(prog
, GL_LINK_STATUS
, &stat
);
230 glGetProgramInfoLog_func(prog
, 1000, &len
, log
);
231 fprintf(stderr
, "Linker error:\n%s\n", log
);
239 static const char *fragShaderText
=
240 "uniform sampler2DShadow shadowTex2D; \n"
241 "uniform sampler2DRectShadow shadowTexRect; \n"
244 " gl_FragColor = shadow2DRectProj(shadowTexRect, gl_TexCoord[0]); \n"
246 " gl_FragColor = shadow2D(shadowTex2D, gl_TexCoord[0].xyz); \n"
249 static const char *vertShaderText
=
251 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
252 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
257 if (!glutExtensionSupported("GL_ARB_texture_rectangle")) {
258 printf("This program requires GL_ARB_texture_rectangle\n");
263 version
= (const char *) glGetString(GL_VERSION
);
264 if (version
[0] != '2' || version
[1] != '.') {
265 printf("This program requires OpenGL 2.x, found %s\n", version
);
268 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
272 fragShader
= glCreateShader_func(GL_FRAGMENT_SHADER
);
274 ReadShader(fragShader
, FragProgFile
);
276 LoadAndCompileShader(fragShader
, fragShaderText
);
278 vertShader
= glCreateShader_func(GL_VERTEX_SHADER
);
280 ReadShader(vertShader
, VertProgFile
);
282 LoadAndCompileShader(vertShader
, vertShaderText
);
284 program
= glCreateProgram_func();
285 glAttachShader_func(program
, fragShader
);
286 glAttachShader_func(program
, vertShader
);
287 glLinkProgram_func(program
);
289 glUseProgram_func(program
);
291 uTexture2D
= glGetUniformLocation_func(program
, "shadowTex2D");
292 uTextureRect
= glGetUniformLocation_func(program
, "shadowTexRect");
293 printf("uTexture2D %d uTextureRect %d\n", uTexture2D
, uTextureRect
);
294 if (uTexture2D
>= 0) {
295 glUniform1i_func(uTexture2D
, 0); /* use texture unit 0 */
297 if (uTextureRect
>= 0) {
298 glUniform1i_func(uTextureRect
, 1); /* use texture unit 0 */
300 CheckError(__LINE__
);
302 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
306 CheckError(__LINE__
);
311 ParseOptions(int argc
, char *argv
[])
314 for (i
= 1; i
< argc
; i
++) {
315 if (strcmp(argv
[i
], "-fs") == 0) {
316 FragProgFile
= argv
[i
+1];
318 else if (strcmp(argv
[i
], "-vs") == 0) {
319 VertProgFile
= argv
[i
+1];
326 main(int argc
, char *argv
[])
328 glutInit(&argc
, argv
);
329 glutInitWindowPosition( 0, 0);
330 glutInitWindowSize(400, 300);
331 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
332 win
= glutCreateWindow(argv
[0]);
334 glutReshapeFunc(Reshape
);
335 glutKeyboardFunc(Key
);
336 glutDisplayFunc(Redisplay
);
337 ParseOptions(argc
, argv
);