diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2011-01-12 22:05:05 -0800 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2011-01-21 21:55:56 -0800 |
commit | 686a7535d84c864a8c1ccc4d8999db17d53d99b0 (patch) | |
tree | a05e3d9fc4f64ee5491dd99498a88a8889ada588 | |
parent | 188c87c3c8c577e2c47eedae39657c4a841b1d8a (diff) |
STUFF!!!
-rwxr-xr-x | src/main.cpp | 38 | ||||
-rwxr-xr-x | src/scene.cpp | 63 | ||||
-rwxr-xr-x | src/scene.h | 3 |
3 files changed, 65 insertions, 39 deletions
diff --git a/src/main.cpp b/src/main.cpp index 7242812..77b9545 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,7 +40,8 @@ static GLuint prog; static GLuint main_fbo; static GLuint main_fbo_tex; -#define VERTEX_SLOT 0 +static GLuint shadow_fbo; +static GLuint shadow_fbo_tex; static GLuint sampler_slot; @@ -49,25 +50,26 @@ Redisplay() { // Render scene to FBO glBindFramebuffer(GL_FRAMEBUFFER, main_fbo); + glClearColor(0.3, 0.3, 0.3, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, win_width, win_height); - Scene::Render(); + Scene::RenderPhong(); - // Blit FBO to screen - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glClear(GL_COLOR_BUFFER_BIT); - - glUseProgram(prog); - glBindTexture(GL_TEXTURE_2D, main_fbo_tex); + glBindFramebuffer(GL_FRAMEBUFFER, shadow_fbo); + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glViewport(0, 0, win_width, win_height); + Scene::RenderShadow(); - glUniform1i(sampler_slot, 0); + // Blit FBO to screen + glBindFramebuffer(GL_READ_FRAMEBUFFER, main_fbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - GLfloat quad[4][2] = {{-1, 1}, {-1, -1}, {1, 1}, {1, -1}}; + glBlitFramebuffer(0, 0, win_width, win_height, 0, 0, win_width, win_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); - glVertexAttribPointer(VERTEX_SLOT, 2, GL_FLOAT, GL_FALSE, 0, quad); - glEnableVertexAttribArray(VERTEX_SLOT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glDisableVertexAttribArray(VERTEX_SLOT); + glBindFramebuffer(GL_READ_FRAMEBUFFER, shadow_fbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBlitFramebuffer(0, 0, win_width, win_height, 0, 0, win_width/4, win_height/4, GL_COLOR_BUFFER_BIT, GL_LINEAR); SDL_GL_SwapBuffers(); } @@ -85,11 +87,6 @@ Idle(void) static void setup_shader() { - if (!load_and_compile_program_code("blit", prog, - "vertex", VERTEX_SLOT, - NULL)) - exit(-1); - sampler_slot = glGetUniformLocation(prog, "sampler"); } @@ -161,6 +158,7 @@ Reshape(int width, int height) glewInit(); create_fbo(main_fbo, main_fbo_tex, width, height, true); + create_fbo(shadow_fbo, shadow_fbo_tex, width, height, false); Scene::Reshape(width, height); } diff --git a/src/scene.cpp b/src/scene.cpp index 36d2ef4..5608379 100755 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -97,7 +97,7 @@ enum { static GLUmat4 projection_matrix; -static GLuint prog_phong; +static GLuint phong_prog; static GLint phong_mvp_location; static GLint phong_mv_location; static GLint phong_m_location; @@ -105,6 +105,9 @@ static GLint phong_s_location; static GLint phong_sampler_location; static GLint phong_eye_location; +static GLuint shadow_prog; +static GLint shadow_mvp_location; + static GLuint cubemap; static patch_set_info *object = NULL; @@ -114,16 +117,12 @@ Render() { const patch_set_info *info = object; - glClearColor(0.3, 0.3, 0.3, 1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - const GLUvec4 ref(0.0f, 0.0f, 0.0f, 1.0f); const GLUvec4 up(0.0f, 1.0f, 0.0f, 0.0f); const GLUmat4 view(gluLookAt(eye, ref, up)); GLUmat4 model(gluRotate(GLUvec4(1.0, 0.0, 0.0, 0.0), 3.0 * M_PI_2)); - glUseProgram(prog_phong); glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap); glBindBuffer(GL_ARRAY_BUFFER, info->buffer_object); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, info->buffer_object); @@ -150,12 +149,18 @@ Render() const GLUmat4 mv(view * m); const GLUmat4 mvp(projection_matrix * mv); - glUniform1f(phong_s_location, specular_exponent[i]); - glUniformMatrix4fv(phong_mvp_location, 1, false, (float *) &mvp); - glUniformMatrix4fv(phong_mv_location, 1, false, (float *) &mv); - glUniformMatrix4fv(phong_m_location, 1, false, (float *) &m); - glUniform1i(phong_sampler_location, 0); - glUniform4fv(phong_eye_location, 1, eye.values); + GLint current_program; + glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program); + if (current_program == shadow_prog) { + glUniformMatrix4fv(shadow_mvp_location, 1, false, (float *) &mvp); + } else { + glUniform1f(phong_s_location, specular_exponent[i]); + glUniformMatrix4fv(phong_mvp_location, 1, false, (float *) &mvp); + glUniformMatrix4fv(phong_mv_location, 1, false, (float *) &mv); + glUniformMatrix4fv(phong_m_location, 1, false, (float *) &m); + glUniform1i(phong_sampler_location, 0); + glUniform4fv(phong_eye_location, 1, eye.values); + } glMultiDrawElements(info->mode, info->count, info->type, (const GLvoid**) info->indices, @@ -174,6 +179,21 @@ Render() } +void +RenderPhong() +{ + glUseProgram(phong_prog); + Render(); +} + +void +RenderShadow() +{ + glUseProgram(shadow_prog); + Render(); +} + + static GLUvec4 lerp(GLUvec4 p0, GLUvec4 p1, float t) { @@ -250,18 +270,25 @@ Idle() static void setup_shader() { - if (!load_and_compile_program_code("phong", prog_phong, + if (!load_and_compile_program_code("phong", phong_prog, "normal", 1, "tangent", 2, "uv", 3, NULL)) exit(-1); - phong_mvp_location = glGetUniformLocation(prog_phong, "mvp"); - phong_mv_location = glGetUniformLocation(prog_phong, "mv"); - phong_m_location = glGetUniformLocation(prog_phong, "m"); - phong_eye_location = glGetUniformLocation(prog_phong, "eye"); - phong_s_location = glGetUniformLocation(prog_phong, "s"); - phong_sampler_location = glGetUniformLocation(prog_phong, "sampler"); + phong_mvp_location = glGetUniformLocation(phong_prog, "mvp"); + phong_mv_location = glGetUniformLocation(phong_prog, "mv"); + phong_m_location = glGetUniformLocation(phong_prog, "m"); + phong_eye_location = glGetUniformLocation(phong_prog, "eye"); + phong_s_location = glGetUniformLocation(phong_prog, "s"); + phong_sampler_location = glGetUniformLocation(phong_prog, "sampler"); + + if (!load_and_compile_program_code("shadow", shadow_prog, + "normal", 1, // FIXME! + NULL)) + exit(-1); + + shadow_mvp_location = glGetUniformLocation(shadow_prog, "mvp"); } diff --git a/src/scene.h b/src/scene.h index 57d2e18..1d6e3f1 100755 --- a/src/scene.h +++ b/src/scene.h @@ -27,7 +27,8 @@ namespace Scene { void Idle(); void Reshape(int width, int height); void Init(); -void Render(); +void RenderPhong(); +void RenderShadow(); void Key(SDLKey sym, bool state); }; |