2 * Procedural Bump Mapping demo. Uses the example shaders from
3 * chapter 11 of the OpenGL Shading Language "orange" book.
14 #include "shaderutil.h"
17 static char *FragProgFile
= "CH11-bumpmap.frag";
18 static char *VertProgFile
= "CH11-bumpmap.vert";
20 /* program/shader objects */
21 static GLuint fragShader
;
22 static GLuint vertShader
;
23 static GLuint program
;
26 static struct uniform_info Uniforms
[] = {
27 { "LightPosition", 1, GL_FLOAT_VEC3
, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
28 { "SurfaceColor", 1, GL_FLOAT_VEC3
, { 0.8, 0.8, 0.2, 0 }, -1 },
29 { "BumpDensity", 1, GL_FLOAT
, { 10.0, 0, 0, 0 }, -1 },
30 { "BumpSize", 1, GL_FLOAT
, { 0.125, 0, 0, 0 }, -1 },
31 { "SpecularFactor", 1, GL_FLOAT
, { 0.5, 0, 0, 0 }, -1 },
37 static GLfloat xRot
= 20.0f
, yRot
= 0.0f
, zRot
= 0.0f
;
39 static GLuint tangentAttrib
;
41 static GLboolean Anim
= GL_FALSE
;
47 GLenum err
= glGetError();
49 printf("GL Error %s (0x%x) at line %d\n",
50 gluErrorString(err
), (int) err
, line
);
55 * Draw a square, specifying normal and tangent vectors.
61 glVertexAttrib3f(tangentAttrib
, 1, 0, 0);
63 glTexCoord2f(0, 0); glVertex2f(-size
, -size
);
64 glTexCoord2f(1, 0); glVertex2f( size
, -size
);
65 glTexCoord2f(1, 1); glVertex2f( size
, size
);
66 glTexCoord2f(0, 1); glVertex2f(-size
, size
);
76 glRotatef(90, 0, 1, 0);
77 glTranslatef(0, 0, size
);
83 glRotatef(-90, 0, 1, 0);
84 glTranslatef(0, 0, size
);
90 glRotatef(90, 1, 0, 0);
91 glTranslatef(0, 0, size
);
97 glRotatef(-90, 1, 0, 0);
98 glTranslatef(0, 0, size
);
105 glTranslatef(0, 0, size
);
111 glRotatef(180, 0, 1, 0);
112 glTranslatef(0, 0, size
);
122 GLint t
= glutGet(GLUT_ELAPSED_TIME
);
131 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
134 glRotatef(xRot
, 1.0f
, 0.0f
, 0.0f
);
135 glRotatef(yRot
, 0.0f
, 1.0f
, 0.0f
);
136 glRotatef(zRot
, 0.0f
, 0.0f
, 1.0f
);
142 CheckError(__LINE__
);
149 Reshape(int width
, int height
)
151 float ar
= (float) width
/ (float) height
;
152 glViewport(0, 0, width
, height
);
153 glMatrixMode(GL_PROJECTION
);
155 glFrustum(-ar
, ar
, -1.0, 1.0, 5.0, 25.0);
156 glMatrixMode(GL_MODELVIEW
);
158 glTranslatef(0.0f
, 0.0f
, -15.0f
);
165 glDeleteShader(fragShader
);
166 glDeleteShader(vertShader
);
167 glDeleteProgram(program
);
168 glutDestroyWindow(win
);
173 Key(unsigned char key
, int x
, int y
)
175 const GLfloat step
= 2.0;
182 glutIdleFunc(Anim
? Idle
: NULL
);
200 SpecialKey(int key
, int x
, int y
)
202 const GLfloat step
= 2.0;
228 if (!ShadersSupported())
231 vertShader
= CompileShaderFile(GL_VERTEX_SHADER
, VertProgFile
);
232 fragShader
= CompileShaderFile(GL_FRAGMENT_SHADER
, FragProgFile
);
233 program
= LinkShaders(vertShader
, fragShader
);
235 glUseProgram(program
);
237 assert(glIsProgram(program
));
238 assert(glIsShader(fragShader
));
239 assert(glIsShader(vertShader
));
241 assert(glGetError() == 0);
243 CheckError(__LINE__
);
245 SetUniformValues(program
, Uniforms
);
246 PrintUniforms(Uniforms
);
248 CheckError(__LINE__
);
250 tangentAttrib
= glGetAttribLocation(program
, "Tangent");
251 printf("Tangent Attrib: %d\n", tangentAttrib
);
253 assert(tangentAttrib
>= 0);
255 CheckError(__LINE__
);
257 glClearColor(0.4f
, 0.4f
, 0.8f
, 0.0f
);
259 glEnable(GL_DEPTH_TEST
);
266 ParseOptions(int argc
, char *argv
[])
269 for (i
= 1; i
< argc
; i
++) {
270 if (strcmp(argv
[i
], "-fs") == 0) {
271 FragProgFile
= argv
[i
+1];
273 else if (strcmp(argv
[i
], "-vs") == 0) {
274 VertProgFile
= argv
[i
+1];
281 main(int argc
, char *argv
[])
283 glutInit(&argc
, argv
);
284 glutInitWindowSize(400, 400);
285 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
286 win
= glutCreateWindow(argv
[0]);
288 glutReshapeFunc(Reshape
);
289 glutKeyboardFunc(Key
);
290 glutSpecialFunc(SpecialKey
);
291 glutDisplayFunc(Redisplay
);
292 ParseOptions(argc
, argv
);