dungeon_crawler

diff prototype/src/renderer_multipass.cc @ 60:aa86119e3295

added multipass deferred
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 25 Sep 2012 06:19:37 +0300
parents
children f71381c9e245
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/prototype/src/renderer_multipass.cc	Tue Sep 25 06:19:37 2012 +0300
     1.3 @@ -0,0 +1,120 @@
     1.4 +#include <stdio.h>
     1.5 +#include <stdlib.h>
     1.6 +#include <string.h>
     1.7 +#include "opengl.h"
     1.8 +#include "renderer_multipass.h"
     1.9 +#include "level.h"
    1.10 +#include "sdr.h"
    1.11 +#include "datapath.h"
    1.12 +
    1.13 +static unsigned int load_sdr(const char *vfname, const char *pfname);
    1.14 +
    1.15 +
    1.16 +MultipassRenderer::MultipassRenderer()
    1.17 +{
    1.18 +	for(int i=0; i<MRT_COUNT; i++) {
    1.19 +		rt_prog[i] = 0;
    1.20 +	}
    1.21 +}
    1.22 +
    1.23 +MultipassRenderer::~MultipassRenderer()
    1.24 +{
    1.25 +	for(int i=0; i<MRT_COUNT; i++) {
    1.26 +		if(rt_prog[i]) {
    1.27 +			free_program(rt_prog[i]);
    1.28 +		}
    1.29 +	}
    1.30 +}
    1.31 +
    1.32 +bool MultipassRenderer::init(int xsz, int ysz)
    1.33 +{
    1.34 +	width = xsz;
    1.35 +	height = ysz;
    1.36 +
    1.37 +	if(!GLEW_ARB_texture_float) {
    1.38 +		fprintf(stderr, "%s: error: no floating point texture support\n", __func__);
    1.39 +		return false;
    1.40 +	}
    1.41 +
    1.42 +	if(!create_fbo()) {
    1.43 +		return false;
    1.44 +	}
    1.45 +
    1.46 +	for(int i=0; i<MRT_COUNT; i++) {
    1.47 +		char fname[128];
    1.48 +		sprintf(fname, "multi%d.p.glsl", i);
    1.49 +
    1.50 +		if(!(rt_prog[i] = load_sdr("mrt.v.glsl", fname))) {
    1.51 +			return false;
    1.52 +		}
    1.53 +		set_uniform_int(rt_prog[i], "tex_dif", 0);
    1.54 +		set_uniform_int(rt_prog[i], "tex_norm", 1);
    1.55 +	}
    1.56 +
    1.57 +	if(!(deferred_omni = load_sdr("deferred_omni.v.glsl", "deferred_omni.p.glsl"))) {
    1.58 +		return false;
    1.59 +	}
    1.60 +	for(int i=0; i<MRT_COUNT; i++) {
    1.61 +		char uname[32];
    1.62 +		sprintf(uname, "mrt%d", i);
    1.63 +		set_uniform_int(deferred_omni, uname, i);
    1.64 +	}
    1.65 +
    1.66 +	rend = this;
    1.67 +	return true;
    1.68 +}
    1.69 +
    1.70 +int MultipassRenderer::get_tangent_location() const
    1.71 +{
    1.72 +	if(!curr_prog) {
    1.73 +		return -1;
    1.74 +	}
    1.75 +	return get_attrib_loc(curr_prog, "attr_tangent");
    1.76 +}
    1.77 +
    1.78 +void MultipassRenderer::render(const Level *level) const
    1.79 +{
    1.80 +	// render into the MRT buffers
    1.81 +	glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
    1.82 +
    1.83 +	for(int i=0; i<MRT_COUNT; i++) {
    1.84 +		glUseProgram(rt_prog[i]);
    1.85 +		curr_prog = rt_prog[i];
    1.86 +
    1.87 +		glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
    1.88 +				mrt_tex[i], 0);
    1.89 +
    1.90 +		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    1.91 +		level->draw();
    1.92 +	}
    1.93 +	glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
    1.94 +
    1.95 +	// post-process lighting
    1.96 +	light_pass(level);
    1.97 +
    1.98 +	glUseProgram(0);
    1.99 +	curr_prog = 0;
   1.100 +}
   1.101 +
   1.102 +static unsigned int load_sdr(const char *vfname, const char *pfname)
   1.103 +{
   1.104 +	char vsfile[PATH_MAX], psfile[PATH_MAX];
   1.105 +	const char *fname;
   1.106 +	unsigned int prog;
   1.107 +
   1.108 +	if((fname = datafile_path(vfname))) {
   1.109 +		strcpy(vsfile, fname);
   1.110 +	} else {
   1.111 +		vsfile[0] = 0;
   1.112 +	}
   1.113 +	if((fname = datafile_path(pfname))) {
   1.114 +		strcpy(psfile, fname);
   1.115 +	} else {
   1.116 +		psfile[0] = 0;
   1.117 +	}
   1.118 +	if(!(prog = create_program_load(vsfile, psfile))) {
   1.119 +		fprintf(stderr, "failed to load shader program (%s, %s)\n", vsfile, psfile);
   1.120 +		return 0;
   1.121 +	}
   1.122 +	return prog;
   1.123 +}