dungeon_crawler
diff prototype/src/renderer_deferred.cc @ 72:a27528035e20
- re-organized the renderer classes a bit wrt final render-target
- implemented identity color-grading palette for now
- broke particle systems....
- removed multipass renderer
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 19 Oct 2012 02:45:57 +0300 |
parents | 45172d087ebe |
children |
line diff
1.1 --- a/prototype/src/renderer_deferred.cc Tue Oct 16 04:08:35 2012 +0300 1.2 +++ b/prototype/src/renderer_deferred.cc Fri Oct 19 02:45:57 2012 +0300 1.3 @@ -10,17 +10,14 @@ 1.4 1.5 static unsigned int load_sdr(const char *vfname, const char *pfname); 1.6 static void attach_color_buffer(unsigned int fbo, int count, const unsigned int *tex); 1.7 -static int round_pow2(int x); 1.8 1.9 DeferredRenderer::DeferredRenderer() 1.10 { 1.11 - fbo = rbuf_depth = rend_tex = 0; 1.12 + fbo = 0; 1.13 for(int i=0; i<MRT_COUNT; i++) { 1.14 mrt_tex[i] = 0; 1.15 } 1.16 - tex_xsz = tex_ysz = 0; 1.17 - 1.18 - mrt_prog = deferred_debug = deferred_omni = post_sdr = 0; 1.19 + mrt_prog = deferred_debug = deferred_omni = 0; 1.20 1.21 curr_prog = 0; 1.22 num_draw_bufs = 1; 1.23 @@ -37,28 +34,17 @@ 1.24 if(deferred_debug) { 1.25 free_program(deferred_debug); 1.26 } 1.27 - if(post_sdr) { 1.28 - free_program(post_sdr); 1.29 - } 1.30 1.31 if(mrt_tex[0]) { 1.32 glDeleteTextures(MRT_COUNT, mrt_tex); 1.33 } 1.34 - if(rend_tex) { 1.35 - glDeleteTextures(1, &rend_tex); 1.36 - } 1.37 - if(rbuf_depth) { 1.38 - glDeleteRenderbuffersEXT(1, &rbuf_depth); 1.39 - } 1.40 - if(fbo) { 1.41 - glDeleteFramebuffersEXT(1, &fbo); 1.42 - } 1.43 } 1.44 1.45 bool DeferredRenderer::init(int xsz, int ysz) 1.46 { 1.47 - width = xsz; 1.48 - height = ysz; 1.49 + if(!Renderer::init(xsz, ysz)) { 1.50 + return false; 1.51 + } 1.52 1.53 if(!GLEW_ARB_texture_float) { 1.54 fprintf(stderr, "%s: error: no floating point texture support\n", __FUNCTION__); 1.55 @@ -78,10 +64,6 @@ 1.56 } 1.57 num_draw_bufs = MRT_COUNT; 1.58 1.59 - if(!create_fbo()) { 1.60 - return false; 1.61 - } 1.62 - 1.63 if(!(mrt_prog = load_sdr("mrt.v.glsl", "mrt.p.glsl"))) { 1.64 return false; 1.65 } 1.66 @@ -97,11 +79,6 @@ 1.67 set_uniform_int(deferred_omni, uname, i); 1.68 } 1.69 1.70 - if(!(post_sdr = load_sdr("post.v.glsl", "post.p.glsl"))) { 1.71 - return false; 1.72 - } 1.73 - 1.74 - rend = this; 1.75 return true; 1.76 } 1.77 1.78 @@ -117,27 +94,20 @@ 1.79 1.80 void DeferredRenderer::resize(int xsz, int ysz) 1.81 { 1.82 - width = xsz; 1.83 - height = ysz; 1.84 + // keep a copy of the previous texture size because Renderer::resize may change it 1.85 + 1.86 + int prev_tex_xsz = tex_xsz; 1.87 + int prev_tex_ysz = tex_ysz; 1.88 + 1.89 + Renderer::resize(xsz, ysz); 1.90 1.91 // if we need a bigger rendertarget ... 1.92 - if(xsz > tex_xsz || ysz > tex_ysz) { 1.93 - tex_xsz = round_pow2(xsz); 1.94 - tex_ysz = round_pow2(ysz); 1.95 - 1.96 + if(xsz > prev_tex_xsz || ysz > prev_tex_ysz) { 1.97 // ... resize all the color buffers 1.98 for(int i=0; i<MRT_COUNT; i++) { 1.99 glBindTexture(GL_TEXTURE_2D, mrt_tex[i]); 1.100 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, tex_xsz, tex_ysz, 0, GL_RGBA, GL_FLOAT, 0); 1.101 } 1.102 - 1.103 - // ... resize the render texture 1.104 - glBindTexture(GL_TEXTURE_2D, rend_tex); 1.105 - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_xsz, tex_ysz, 0, GL_RGBA, GL_FLOAT, 0); 1.106 - 1.107 - // ... resize the depth buffer 1.108 - glBindRenderbufferEXT(GL_RENDERBUFFER, rbuf_depth); 1.109 - glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tex_xsz, tex_ysz); 1.110 } 1.111 1.112 // update the texture coordinate scaling factors 1.113 @@ -174,23 +144,6 @@ 1.114 render_post(level); 1.115 1.116 glBindFramebufferEXT(GL_FRAMEBUFFER, 0); 1.117 - 1.118 - // XXX this should be moved to render_post 1.119 - glBindTexture(GL_TEXTURE_2D, rend_tex); 1.120 - glEnable(GL_TEXTURE_2D); 1.121 - 1.122 - glUseProgram(post_sdr); 1.123 - glBegin(GL_QUADS); 1.124 - glTexCoord2f(0, 0); 1.125 - glVertex2f(-1, -1); 1.126 - glTexCoord2f((float)width / tex_xsz, 0); 1.127 - glVertex2f(1, -1); 1.128 - glTexCoord2f((float)width / tex_xsz, (float)height / tex_ysz); 1.129 - glVertex2f(1, 1); 1.130 - glTexCoord2f(0, (float)height / tex_ysz); 1.131 - glVertex2f(-1, 1); 1.132 - glEnd(); 1.133 - glUseProgram(0); 1.134 } 1.135 1.136 void DeferredRenderer::light_pass(const Level *level) const 1.137 @@ -237,30 +190,16 @@ 1.138 "GL_FRAMEBUFFER_UNSUPPORTED" 1.139 }; 1.140 1.141 -bool DeferredRenderer::create_fbo() 1.142 +bool DeferredRenderer::create_rtarg() 1.143 { 1.144 + if(!Renderer::create_rtarg()) { 1.145 + return false; 1.146 + } 1.147 + 1.148 unsigned int clamp = GLEW_ARB_texture_border_clamp ? GL_CLAMP_TO_EDGE : GL_CLAMP; 1.149 1.150 - // round the texture size up to the next power of 2 1.151 - tex_xsz = round_pow2(width); 1.152 - tex_ysz = round_pow2(height); 1.153 - 1.154 - if(!glGenFramebuffersEXT) { 1.155 - fprintf(stderr, "FBO support missing\n"); 1.156 - return false; 1.157 - } 1.158 - glGenFramebuffersEXT(1, &fbo); 1.159 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); 1.160 1.161 - // create the result render target 1.162 - glGenTextures(1, &rend_tex); 1.163 - glBindTexture(GL_TEXTURE_2D, rend_tex); 1.164 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp); 1.165 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp); 1.166 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1.167 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1.168 - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_xsz, tex_ysz, 0, GL_RGBA, GL_FLOAT, 0); 1.169 - 1.170 glGenTextures(MRT_COUNT, mrt_tex); 1.171 for(int i=0; i<MRT_COUNT; i++) { 1.172 glBindTexture(GL_TEXTURE_2D, mrt_tex[i]); 1.173 @@ -276,11 +215,6 @@ 1.174 CHECKGLERR; 1.175 } 1.176 1.177 - glGenRenderbuffersEXT(1, &rbuf_depth); 1.178 - glBindRenderbufferEXT(GL_RENDERBUFFER, rbuf_depth); 1.179 - glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tex_xsz, tex_ysz); 1.180 - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_depth); 1.181 - 1.182 int fbst = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 1.183 if(fbst != GL_FRAMEBUFFER_COMPLETE) { 1.184 fprintf(stderr, "incomplete fbo: %u (%s)\n", fbo, fbstname[fbst - GL_FRAMEBUFFER_COMPLETE]); 1.185 @@ -328,17 +262,6 @@ 1.186 glDrawBuffersARB(count, draw_bufs); 1.187 } 1.188 1.189 -static int round_pow2(int x) 1.190 -{ 1.191 - x--; 1.192 - x = (x >> 1) | x; 1.193 - x = (x >> 2) | x; 1.194 - x = (x >> 4) | x; 1.195 - x = (x >> 8) | x; 1.196 - x = (x >> 16) | x; 1.197 - return x + 1; 1.198 -} 1.199 - 1.200 #ifdef DBG_VIS_MRT 1.201 // visualize the MRT buffers 1.202 static void draw_deferred_debug()