nuclear@41: #include nuclear@41: #include nuclear@41: #include nuclear@41: #include nuclear@41: #include "opengl.h" nuclear@41: #include "renderer_deferred.h" nuclear@41: #include "level.h" nuclear@41: #include "sdr.h" nuclear@41: #include "datapath.h" nuclear@41: nuclear@41: static unsigned int load_sdr(const char *vfname, const char *pfname); nuclear@65: static void attach_color_buffer(unsigned int fbo, int count, const unsigned int *tex); nuclear@41: nuclear@41: DeferredRenderer::DeferredRenderer() nuclear@41: { nuclear@72: fbo = 0; nuclear@41: for(int i=0; i prev_tex_xsz || ysz > prev_tex_ysz) { nuclear@41: // ... resize all the color buffers nuclear@41: for(int i=0; idraw(); nuclear@65: nuclear@65: attach_color_buffer(fbo, 1, &rend_tex); nuclear@65: glClear(GL_COLOR_BUFFER_BIT); nuclear@41: nuclear@41: // post-process lighting nuclear@60: light_pass(level); nuclear@60: nuclear@60: glUseProgram(0); nuclear@60: curr_prog = 0; nuclear@62: nuclear@62: render_post(level); nuclear@65: nuclear@65: glBindFramebufferEXT(GL_FRAMEBUFFER, 0); nuclear@60: } nuclear@60: nuclear@60: void DeferredRenderer::light_pass(const Level *level) const nuclear@60: { nuclear@65: glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_TEXTURE_BIT); nuclear@41: nuclear@41: glEnable(GL_BLEND); nuclear@41: glBlendFunc(GL_ONE, GL_ONE); nuclear@41: nuclear@41: glDisable(GL_LIGHTING); nuclear@41: glDisable(GL_DEPTH_TEST); nuclear@41: glCullFace(GL_FRONT); nuclear@41: nuclear@41: glUseProgram(deferred_omni); nuclear@41: curr_prog = deferred_omni; nuclear@41: nuclear@41: for(int i=0; idraw_lights(); nuclear@41: glDepthMask(1); nuclear@41: nuclear@41: for(int i=0; i