dungeon_crawler
diff prototype/src/renderer_deferred.cc @ 60:aa86119e3295
added multipass deferred
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 25 Sep 2012 06:19:37 +0300 |
parents | acfe0c0110fc |
children | f71381c9e245 |
line diff
1.1 --- a/prototype/src/renderer_deferred.cc Fri Sep 21 05:28:45 2012 +0300 1.2 +++ b/prototype/src/renderer_deferred.cc Tue Sep 25 06:19:37 2012 +0300 1.3 @@ -22,6 +22,7 @@ 1.4 mrt_prog = deferred_debug = deferred_omni = 0; 1.5 1.6 curr_prog = 0; 1.7 + num_draw_bufs = 1; 1.8 } 1.9 1.10 DeferredRenderer::~DeferredRenderer() 1.11 @@ -65,6 +66,7 @@ 1.12 fprintf(stderr, "%s: error: not enough draw buffers (%d), %d required\n", __func__, max_draw_buf, MRT_COUNT); 1.13 return false; 1.14 } 1.15 + num_draw_bufs = MRT_COUNT; 1.16 1.17 if(!create_fbo()) { 1.18 return false; 1.19 @@ -138,10 +140,17 @@ 1.20 1.21 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 1.22 level->draw(); 1.23 - 1.24 glBindFramebufferEXT(GL_FRAMEBUFFER, 0); 1.25 1.26 // post-process lighting 1.27 + light_pass(level); 1.28 + 1.29 + glUseProgram(0); 1.30 + curr_prog = 0; 1.31 +} 1.32 + 1.33 +void DeferredRenderer::light_pass(const Level *level) const 1.34 +{ 1.35 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT); 1.36 1.37 glEnable(GL_BLEND); 1.38 @@ -169,8 +178,6 @@ 1.39 glDisable(GL_TEXTURE_2D); 1.40 } 1.41 1.42 - glUseProgram(0); 1.43 - curr_prog = 0; 1.44 glPopAttrib(); 1.45 } 1.46 1.47 @@ -211,18 +218,21 @@ 1.48 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, tex_xsz, tex_ysz, 0, GL_RGBA, GL_FLOAT, 0); 1.49 1.50 // attach to fbo 1.51 - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, 1.52 - GL_TEXTURE_2D, mrt_tex[i], 0); 1.53 + GLenum color_att = num_draw_bufs >= MRT_COUNT ? GL_COLOR_ATTACHMENT0 + i : GL_COLOR_ATTACHMENT0; 1.54 + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, color_att, GL_TEXTURE_2D, 1.55 + mrt_tex[i], 0); 1.56 CHECKGLERR; 1.57 } 1.58 1.59 - static GLenum draw_bufs[] = { 1.60 - GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, 1.61 - GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 1.62 - GL_COLOR_ATTACHMENT4_EXT, GL_COLOR_ATTACHMENT5_EXT, 1.63 - GL_COLOR_ATTACHMENT6_EXT, GL_COLOR_ATTACHMENT7_EXT 1.64 - }; 1.65 - glDrawBuffersARB(MRT_COUNT, draw_bufs); 1.66 + if(num_draw_bufs >= MRT_COUNT) { 1.67 + static GLenum draw_bufs[] = { 1.68 + GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, 1.69 + GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 1.70 + GL_COLOR_ATTACHMENT4_EXT, GL_COLOR_ATTACHMENT5_EXT, 1.71 + GL_COLOR_ATTACHMENT6_EXT, GL_COLOR_ATTACHMENT7_EXT 1.72 + }; 1.73 + glDrawBuffersARB(num_draw_bufs, draw_bufs); 1.74 + } 1.75 1.76 glGenRenderbuffersEXT(1, &rbuf_depth); 1.77 glBindRenderbufferEXT(GL_RENDERBUFFER, rbuf_depth);