dungeon_crawler
diff prototype/src/renderer.cc @ 19:8a0ae6b4aa9b
trying to make MRT work
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 21 Aug 2012 04:29:49 +0300 |
parents | 5c41e6fcb300 |
children | 48cfd351a9be |
line diff
1.1 --- a/prototype/src/renderer.cc Tue Aug 21 03:17:48 2012 +0300 1.2 +++ b/prototype/src/renderer.cc Tue Aug 21 04:29:49 2012 +0300 1.3 @@ -14,7 +14,7 @@ 1.4 static int round_pow2(int x); 1.5 1.6 1.7 -#define MRT_COUNT 1 1.8 +#define MRT_COUNT 4 1.9 static unsigned int mrt_tex[MRT_COUNT]; 1.10 1.11 static unsigned int mrt_prog; 1.12 @@ -37,9 +37,20 @@ 1.13 1.14 bool init_renderer(int xsz, int ysz) 1.15 { 1.16 + int max_draw_buf; 1.17 + 1.18 + glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buf); 1.19 + CHECKGLERR; 1.20 + printf("max draw buffers: %d\n", max_draw_buf); 1.21 + if(max_draw_buf < MRT_COUNT) { 1.22 + fprintf(stderr, "OpenGL implementation doesn't support enough draw buffers\n"); 1.23 + return false; 1.24 + } 1.25 + 1.26 if(!create_fbo(xsz, ysz)) { 1.27 return false; 1.28 } 1.29 + CHECKGLERR; 1.30 1.31 if(!(mrt_prog = load_sdr("mrt.v.glsl", "mrt.p.glsl"))) { 1.32 return false; 1.33 @@ -63,8 +74,17 @@ 1.34 { 1.35 int loc; 1.36 1.37 + static GLenum draw_bufs[] = { 1.38 + GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, 1.39 + GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, 1.40 + GL_COLOR_ATTACHMENT4_EXT, GL_COLOR_ATTACHMENT5_EXT, 1.41 + GL_COLOR_ATTACHMENT6_EXT, GL_COLOR_ATTACHMENT7_EXT 1.42 + }; 1.43 + 1.44 // render into the MRT buffers 1.45 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); 1.46 + glDrawBuffersARB(MRT_COUNT, draw_bufs); 1.47 + 1.48 glUseProgram(mrt_prog); 1.49 draw_func(); 1.50 glUseProgram(0); 1.51 @@ -76,12 +96,19 @@ 1.52 1.53 glDisable(GL_LIGHTING); 1.54 glDisable(GL_DEPTH_TEST); 1.55 - glBindTexture(GL_TEXTURE_2D, mrt_tex[0]); 1.56 - glEnable(GL_TEXTURE_2D); 1.57 1.58 glUseProgram(deferred_debug); 1.59 - if((loc = glGetUniformLocation(deferred_debug, "tex0")) != -1) { 1.60 - glUniform1i(loc, 0); 1.61 + for(int i=0; i<MRT_COUNT; i++) { 1.62 + char uname[32]; 1.63 + 1.64 + sprintf(uname, "mrt%d", i); 1.65 + if((loc = glGetUniformLocation(deferred_debug, uname)) != -1) { 1.66 + glUniform1i(loc, i); 1.67 + } 1.68 + 1.69 + glActiveTexture(GL_TEXTURE0 + i); 1.70 + glBindTexture(GL_TEXTURE_2D, mrt_tex[i]); 1.71 + glEnable(GL_TEXTURE_2D); 1.72 } 1.73 if((loc = glGetUniformLocation(deferred_debug, "tex_scale")) != -1) { 1.74 glUniform2f(loc, (float)fb_xsz / tex_xsz, (float)fb_ysz / tex_ysz); 1.75 @@ -98,6 +125,11 @@ 1.76 glVertex2f(-1, 1); 1.77 glEnd(); 1.78 1.79 + for(int i=0; i<MRT_COUNT; i++) { 1.80 + glActiveTexture(GL_TEXTURE0 + MRT_COUNT - i - 1); 1.81 + glDisable(GL_TEXTURE_2D); 1.82 + } 1.83 + 1.84 glUseProgram(0); 1.85 glPopAttrib(); 1.86 }