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 +}