# HG changeset patch # User John Tsiombikas # Date 1345512589 -10800 # Node ID 8a0ae6b4aa9b7663d8846fadf2fce8fb3c9f6545 # Parent 5c41e6fcb3009a5fb6c4e24b6b1759c9372dc5ae trying to make MRT work diff -r 5c41e6fcb300 -r 8a0ae6b4aa9b prototype/sdr/deferred.p.glsl --- a/prototype/sdr/deferred.p.glsl Tue Aug 21 03:17:48 2012 +0300 +++ b/prototype/sdr/deferred.p.glsl Tue Aug 21 04:29:49 2012 +0300 @@ -1,8 +1,21 @@ -uniform sampler2D mrt0; +uniform sampler2D mrt0, mrt1, mrt2, mrt3; uniform vec2 tex_scale; void main() { - vec4 texel0 = texture2D(mrt0, gl_TexCoord[0].st * tex_scale); - gl_FragColor = texel0; + vec2 tc = gl_TexCoord[0].st; + //vec4 texel0 = texture2D(mrt0, gl_TexCoord[0].st * s); + + vec4 texel; + if(tc.x < 0.25) { + texel = texture2D(mrt0, tc * vec2(4.0, 1.0) * tex_scale); + } else if(tc.x < 0.5) { + texel = texture2D(mrt0, (tc - vec2(0.25, 0.0)) * vec2(4.0, 1.0) * tex_scale); + } else if(tc.x < 0.75) { + texel = texture2D(mrt0, (tc - vec2(0.5, 0.0)) * vec2(4.0, 1.0) * tex_scale); + } else { + texel = texture2D(mrt0, (tc - vec2(0.75, 0.0)) * vec2(4.0, 1.0) * tex_scale); + } + + gl_FragColor = texel; } diff -r 5c41e6fcb300 -r 8a0ae6b4aa9b prototype/sdr/mrt.p.glsl --- a/prototype/sdr/mrt.p.glsl Tue Aug 21 03:17:48 2012 +0300 +++ b/prototype/sdr/mrt.p.glsl Tue Aug 21 04:29:49 2012 +0300 @@ -3,5 +3,8 @@ void main() { vec4 texel = texture2D(tex_dif, gl_TexCoord[0].st); - gl_FragColor = texel; + gl_FragData[0] = texel * vec4(1.0, 0.0, 0.0, 1.0); + gl_FragData[1] = texel * vec4(0.0, 1.0, 0.0, 1.0); + gl_FragData[2] = texel * vec4(0.0, 0.0, 1.0, 1.0); + gl_FragData[3] = texel * vec4(1.0, 0.0, 0.0, 1.0); } diff -r 5c41e6fcb300 -r 8a0ae6b4aa9b prototype/src/renderer.cc --- a/prototype/src/renderer.cc Tue Aug 21 03:17:48 2012 +0300 +++ b/prototype/src/renderer.cc Tue Aug 21 04:29:49 2012 +0300 @@ -14,7 +14,7 @@ static int round_pow2(int x); -#define MRT_COUNT 1 +#define MRT_COUNT 4 static unsigned int mrt_tex[MRT_COUNT]; static unsigned int mrt_prog; @@ -37,9 +37,20 @@ bool init_renderer(int xsz, int ysz) { + int max_draw_buf; + + glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buf); + CHECKGLERR; + printf("max draw buffers: %d\n", max_draw_buf); + if(max_draw_buf < MRT_COUNT) { + fprintf(stderr, "OpenGL implementation doesn't support enough draw buffers\n"); + return false; + } + if(!create_fbo(xsz, ysz)) { return false; } + CHECKGLERR; if(!(mrt_prog = load_sdr("mrt.v.glsl", "mrt.p.glsl"))) { return false; @@ -63,8 +74,17 @@ { int loc; + static GLenum draw_bufs[] = { + GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, + GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, + GL_COLOR_ATTACHMENT4_EXT, GL_COLOR_ATTACHMENT5_EXT, + GL_COLOR_ATTACHMENT6_EXT, GL_COLOR_ATTACHMENT7_EXT + }; + // render into the MRT buffers glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); + glDrawBuffersARB(MRT_COUNT, draw_bufs); + glUseProgram(mrt_prog); draw_func(); glUseProgram(0); @@ -76,12 +96,19 @@ glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); - glBindTexture(GL_TEXTURE_2D, mrt_tex[0]); - glEnable(GL_TEXTURE_2D); glUseProgram(deferred_debug); - if((loc = glGetUniformLocation(deferred_debug, "tex0")) != -1) { - glUniform1i(loc, 0); + for(int i=0; i