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);