dungeon_crawler

view 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 source
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "opengl.h"
5 #include "renderer_multipass.h"
6 #include "level.h"
7 #include "sdr.h"
8 #include "datapath.h"
10 static unsigned int load_sdr(const char *vfname, const char *pfname);
13 MultipassRenderer::MultipassRenderer()
14 {
15 for(int i=0; i<MRT_COUNT; i++) {
16 rt_prog[i] = 0;
17 }
18 }
20 MultipassRenderer::~MultipassRenderer()
21 {
22 for(int i=0; i<MRT_COUNT; i++) {
23 if(rt_prog[i]) {
24 free_program(rt_prog[i]);
25 }
26 }
27 }
29 bool MultipassRenderer::init(int xsz, int ysz)
30 {
31 width = xsz;
32 height = ysz;
34 if(!GLEW_ARB_texture_float) {
35 fprintf(stderr, "%s: error: no floating point texture support\n", __func__);
36 return false;
37 }
39 if(!create_fbo()) {
40 return false;
41 }
43 for(int i=0; i<MRT_COUNT; i++) {
44 char fname[128];
45 sprintf(fname, "multi%d.p.glsl", i);
47 if(!(rt_prog[i] = load_sdr("mrt.v.glsl", fname))) {
48 return false;
49 }
50 set_uniform_int(rt_prog[i], "tex_dif", 0);
51 set_uniform_int(rt_prog[i], "tex_norm", 1);
52 }
54 if(!(deferred_omni = load_sdr("deferred_omni.v.glsl", "deferred_omni.p.glsl"))) {
55 return false;
56 }
57 for(int i=0; i<MRT_COUNT; i++) {
58 char uname[32];
59 sprintf(uname, "mrt%d", i);
60 set_uniform_int(deferred_omni, uname, i);
61 }
63 rend = this;
64 return true;
65 }
67 int MultipassRenderer::get_tangent_location() const
68 {
69 if(!curr_prog) {
70 return -1;
71 }
72 return get_attrib_loc(curr_prog, "attr_tangent");
73 }
75 void MultipassRenderer::render(const Level *level) const
76 {
77 // render into the MRT buffers
78 glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
80 for(int i=0; i<MRT_COUNT; i++) {
81 glUseProgram(rt_prog[i]);
82 curr_prog = rt_prog[i];
84 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
85 mrt_tex[i], 0);
87 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
88 level->draw();
89 }
90 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
92 // post-process lighting
93 light_pass(level);
95 glUseProgram(0);
96 curr_prog = 0;
97 }
99 static unsigned int load_sdr(const char *vfname, const char *pfname)
100 {
101 char vsfile[PATH_MAX], psfile[PATH_MAX];
102 const char *fname;
103 unsigned int prog;
105 if((fname = datafile_path(vfname))) {
106 strcpy(vsfile, fname);
107 } else {
108 vsfile[0] = 0;
109 }
110 if((fname = datafile_path(pfname))) {
111 strcpy(psfile, fname);
112 } else {
113 psfile[0] = 0;
114 }
115 if(!(prog = create_program_load(vsfile, psfile))) {
116 fprintf(stderr, "failed to load shader program (%s, %s)\n", vsfile, psfile);
117 return 0;
118 }
119 return prog;
120 }