diff options
Diffstat (limited to 'src/main.cpp')
-rwxr-xr-x | src/main.cpp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/main.cpp b/src/main.cpp index cf56f38..e934eca 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,8 +36,10 @@ static bool done = false; static int win_width, win_height; static GLuint main_fbo; -static GLuint main_fbo_tex; -static GLuint main_fbo_depth_tex; +static GLuint color_tex; +static GLuint depth_tex; +static GLuint es_pos_tex; +static GLuint es_normal_tex; static GLuint prog; static GLuint sampler_slot; @@ -46,8 +48,10 @@ static void Redisplay() { // Render scene to FBO - glCullFace(GL_BACK); glBindFramebuffer(GL_FRAMEBUFFER, main_fbo); + // ...but first, turn on MRT: + GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; + glDrawBuffers(3, buffers); glClearColor(0.3, 0.3, 0.3, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Scene::Reshape(win_width, win_height); @@ -57,7 +61,7 @@ Redisplay() glBindFramebuffer(GL_FRAMEBUFFER, 0); glUseProgram(prog); - glBindTexture(GL_TEXTURE_2D, main_fbo_tex); + glBindTexture(GL_TEXTURE_2D, color_tex); glUniform1i(sampler_slot, 0); GLfloat quad[4][2] = {{-1, 1}, {-1, -1}, {1, 1}, {1, -1}}; @@ -125,23 +129,42 @@ Reshape(int width, int height) glGenFramebuffers(1, &main_fbo); glBindFramebuffer(GL_FRAMEBUFFER, main_fbo); - glGenTextures(1, &main_fbo_tex); - glBindTexture(GL_TEXTURE_2D, main_fbo_tex); + glGenTextures(1, &color_tex); + glBindTexture(GL_TEXTURE_2D, color_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, main_fbo_tex, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_tex, 0); - glGenTextures(1, &main_fbo_depth_tex); - glBindTexture(GL_TEXTURE_2D, main_fbo_depth_tex); + glGenTextures(1, &es_pos_tex); + glBindTexture(GL_TEXTURE_2D, es_pos_tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, es_pos_tex, 0); + + glGenTextures(1, &es_normal_tex); + glBindTexture(GL_TEXTURE_2D, es_normal_tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, es_normal_tex, 0); + + + glGenTextures(1, &depth_tex); + glBindTexture(GL_TEXTURE_2D, depth_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, main_fbo_depth_tex, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_tex, 0); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { printf("main FBO not complete\n"); |