2 * Test shadow2DRectProj() and shadow2D() functions.
7 #define GL_GLEXT_PROTOTYPES
19 /** Use GL_RECTANGLE texture (with projective texcoords)? */
25 static char *FragProgFile
= NULL
;
26 static char *VertProgFile
= NULL
;
28 static GLuint fragShader
;
29 static GLuint vertShader
;
30 static GLuint program
;
32 static GLint uTexture2D
;
33 static GLint uTextureRect
;
37 static GLenum Filter
= GL_LINEAR
;
42 GLenum err
= glGetError();
44 printf("GL Error %s (0x%x) at line %d\n",
45 gluErrorString(err
), (int) err
, line
);
51 PrintString(const char *s
)
54 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
64 glClear(GL_COLOR_BUFFER_BIT
);
69 glUseProgram_func(program
);
74 /* scale coords by two to test projection */
75 glTexCoord4f( 0, 0, 0, 2.0); glVertex2f(-1, -1);
76 glTexCoord4f(2*TEXSIZE
, 0, 2*1, 2.0); glVertex2f( 1, -1);
77 glTexCoord4f(2*TEXSIZE
, 2*TEXSIZE
, 2*1, 2.0); glVertex2f( 1, 1);
78 glTexCoord4f( 0, 2*TEXSIZE
, 0, 2.0); glVertex2f(-1, 1);
80 glTexCoord3f(0, 0, 0); glVertex2f(-1, -1);
81 glTexCoord3f(1, 0, 1); glVertex2f( 1, -1);
82 glTexCoord3f(1, 1, 1); glVertex2f( 1, 1);
83 glTexCoord3f(0, 1, 0); glVertex2f(-1, 1);
90 glWindowPos2iARB(80, 20);
91 PrintString("white black white black");
98 Reshape(int width
, int height
)
100 glViewport(0, 0, width
, height
);
101 glMatrixMode(GL_PROJECTION
);
103 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
104 glMatrixMode(GL_MODELVIEW
);
106 glTranslatef(0.0f
, 0.0f
, -8.0f
);
113 glDeleteShader_func(fragShader
);
114 glDeleteShader_func(vertShader
);
115 glDeleteProgram_func(program
);
116 glutDestroyWindow(win
);
121 Key(unsigned char key
, int x
, int y
)
139 GLfloat image
[TEXSIZE
][TEXSIZE
];
142 for (i
= 0; i
< TEXSIZE
; i
++) {
143 for (j
= 0; j
< TEXSIZE
; j
++) {
144 if (j
< (TEXSIZE
/ 2)) {
153 glActiveTexture(GL_TEXTURE0
); /* unit 0 */
154 glBindTexture(GL_TEXTURE_2D
, 42);
155 glTexImage2D(GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
, TEXSIZE
, TEXSIZE
, 0,
156 GL_DEPTH_COMPONENT
, GL_FLOAT
, image
);
157 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
158 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, Filter
);
159 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, Filter
);
160 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_COMPARE_MODE_ARB
,
161 GL_COMPARE_R_TO_TEXTURE_ARB
);
162 CheckError(__LINE__
);
164 glActiveTexture(GL_TEXTURE1
); /* unit 1 */
165 glBindTexture(GL_TEXTURE_RECTANGLE_ARB
, 43);
166 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB
, 0, GL_DEPTH_COMPONENT
,
167 TEXSIZE
, 10, 0,/*16x10*/
168 GL_DEPTH_COMPONENT
, GL_FLOAT
, image
);
169 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, Filter
);
170 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MAG_FILTER
, Filter
);
171 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_COMPARE_MODE_ARB
,
172 GL_COMPARE_R_TO_TEXTURE_ARB
);
173 CheckError(__LINE__
);
178 LoadAndCompileShader(GLuint shader
, const char *text
)
181 glShaderSource_func(shader
, 1, (const GLchar
**) &text
, NULL
);
182 glCompileShader_func(shader
);
183 glGetShaderiv_func(shader
, GL_COMPILE_STATUS
, &stat
);
187 glGetShaderInfoLog_func(shader
, 1000, &len
, log
);
188 fprintf(stderr
, "fslight: problem compiling shader:\n%s\n", log
);
195 * Read a shader from a file.
198 ReadShader(GLuint shader
, const char *filename
)
200 const int max
= 100*1000;
202 char *buffer
= (char*) malloc(max
);
203 FILE *f
= fopen(filename
, "r");
205 fprintf(stderr
, "fslight: Unable to open shader file %s\n", filename
);
209 n
= fread(buffer
, 1, max
, f
);
210 printf("fslight: read %d bytes from shader file %s\n", n
, filename
);
213 LoadAndCompileShader(shader
, buffer
);
222 CheckLink(GLuint prog
)
225 glGetProgramiv_func(prog
, GL_LINK_STATUS
, &stat
);
229 glGetProgramInfoLog_func(prog
, 1000, &len
, log
);
230 fprintf(stderr
, "Linker error:\n%s\n", log
);
238 static const char *fragShaderText
=
239 "uniform sampler2DShadow shadowTex2D; \n"
240 "uniform sampler2DRectShadow shadowTexRect; \n"
243 " gl_FragColor = shadow2DRectProj(shadowTexRect, gl_TexCoord[0]); \n"
245 " gl_FragColor = shadow2D(shadowTex2D, gl_TexCoord[0].xyz); \n"
248 static const char *vertShaderText
=
250 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
251 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
256 if (!glutExtensionSupported("GL_ARB_texture_rectangle")) {
257 printf("This program requires GL_ARB_texture_rectangle\n");
262 version
= (const char *) glGetString(GL_VERSION
);
263 if (version
[0] != '2' || version
[1] != '.') {
264 printf("This program requires OpenGL 2.x, found %s\n", version
);
267 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
271 fragShader
= glCreateShader_func(GL_FRAGMENT_SHADER
);
273 ReadShader(fragShader
, FragProgFile
);
275 LoadAndCompileShader(fragShader
, fragShaderText
);
277 vertShader
= glCreateShader_func(GL_VERTEX_SHADER
);
279 ReadShader(vertShader
, VertProgFile
);
281 LoadAndCompileShader(vertShader
, vertShaderText
);
283 program
= glCreateProgram_func();
284 glAttachShader_func(program
, fragShader
);
285 glAttachShader_func(program
, vertShader
);
286 glLinkProgram_func(program
);
288 glUseProgram_func(program
);
290 uTexture2D
= glGetUniformLocation_func(program
, "shadowTex2D");
291 uTextureRect
= glGetUniformLocation_func(program
, "shadowTexRect");
292 printf("uTexture2D %d uTextureRect %d\n", uTexture2D
, uTextureRect
);
293 if (uTexture2D
>= 0) {
294 glUniform1i_func(uTexture2D
, 0); /* use texture unit 0 */
296 if (uTextureRect
>= 0) {
297 glUniform1i_func(uTextureRect
, 1); /* use texture unit 0 */
299 CheckError(__LINE__
);
301 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
305 CheckError(__LINE__
);
310 ParseOptions(int argc
, char *argv
[])
313 for (i
= 1; i
< argc
; i
++) {
314 if (strcmp(argv
[i
], "-fs") == 0) {
315 FragProgFile
= argv
[i
+1];
317 else if (strcmp(argv
[i
], "-vs") == 0) {
318 VertProgFile
= argv
[i
+1];
325 main(int argc
, char *argv
[])
327 glutInit(&argc
, argv
);
328 glutInitWindowPosition( 0, 0);
329 glutInitWindowSize(400, 300);
330 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
331 win
= glutCreateWindow(argv
[0]);
332 glutReshapeFunc(Reshape
);
333 glutKeyboardFunc(Key
);
334 glutDisplayFunc(Redisplay
);
335 ParseOptions(argc
, argv
);