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