summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2011-01-12 22:05:05 -0800
committerKenneth Graunke <kenneth@whitecape.org>2011-01-21 21:55:56 -0800
commit686a7535d84c864a8c1ccc4d8999db17d53d99b0 (patch)
treea05e3d9fc4f64ee5491dd99498a88a8889ada588
parent188c87c3c8c577e2c47eedae39657c4a841b1d8a (diff)
STUFF!!!
-rwxr-xr-xsrc/main.cpp38
-rwxr-xr-xsrc/scene.cpp63
-rwxr-xr-xsrc/scene.h3
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, &current_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);
};