PDA

View Full Version : Reusing G-Buffer



ei05tbe
08-06-2010, 05:09 AM
I would like to render a scene. I would like to render it in 2 passes and blend everything togheter. Is it possible to use the same G-Buffer. When can I clear it?

If a remove the comment in the code below only the first pass is visible on the screen. With the comment everthing I wont is visible on the screen but whit "tracks" when I move the camera around.

38 void GBuffer::bindFrameBuffer(){
39 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_frame);
40 glDrawBuffers(3, m_buffers);
41 // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
42 }



103 void RenderVisitor::deferredShading(vector<Light> lights, Camera *camera){
104 glUseProgram(m_deferredShadingProgram->getID());
105 m_gBuffer->bindFrameBuffer();
106 //Render the whole scene in to FBO
107 for(unsigned int i = 0; i < m_renderList.size(); i++){
108 m_renderList[i].render();
109 }
110 //renderLights(lights,camera);
111 m_gBuffer->unBindFrameBuffer();
112
113 m_gBuffer->bindTextures();
114 glUseProgram(m_deferredShadingProgram->getID());
115
116 glEnable(GL_BLEND);
117 for(unsigned int i = 0; i < lights.size() ; i ++){
118 if(lights[i].isOn()){
119 lights[i].apply(GL_LIGHT0);
120 drawQuad();
121 }
122 }
/************************************************** *********/
Second pass. Only code above this line appears on the screen.
If the comment 41 // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
is present everything apears on the screen but whit tracks.
123 //Here I wont to use the same g-buffer.
124 glUseProgram(m_lightToGBufferProgram->getID());
125 m_gBuffer->bindFrameBuffer();
126 renderLights(lights,camera);
127 m_gBuffer->unBindFrameBuffer();
128 //Render the lights scene in to FBO
129
130 m_gBuffer->bindTextures();
131 glUseProgram(m_renderLightsProgram->getID());
132 drawQuad();
133 glDisable(GL_BLEND);
134 reset();
135 }

Ilian Dinev
08-06-2010, 02:13 PM
Yes, you can reuse it like that - via glClear. Most games call glClear(gl_depth_buffer_bit) 2-10 times per frame.
It's just like any memory-array operation; you can clear/destroy the data when you no longer need it.

ei05tbe
08-07-2010, 01:24 AM
Thanks you that is what I am trying to do now.
Now that is what I am doing. I clear it this way


36 void clear() { bindFrameBuffer();
37 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
38 unBindFrameBuffer(); }


Any I clear the FBO after I have rendered the quad to the screen. Any Idea why only my first pass(code above /************************************************** *********/) is visible on the screen? If I don't render the quads on the first pass then my light system is visible. I don't clean the screen right? Only the FBO.



63 void rendervisitor::deferredshading(vector<light> lights, camera *camera){
264
265 m_gbuffer->clear();
266 m_gbuffer->bindframebuffer();
267 //render the whole scene in to fbo
268 for(unsigned int i = 0; i < m_renderlist.size(); i++){
269 m_renderlist[i].render();
270 }
271 m_gbuffer->unbindframebuffer();
272
273 m_gbuffer->bindtextures();
274 gluseprogram(m_deferredshadingprogram->getid());
275 glenable(gl_blend);
276 for(unsigned int i = 0; i < lights.size() ; i ++){
277 if(lights[i].ison()){
278 lights[i].apply(gl_light0);
279 drawquad();
280 }
281 }
282 m_gbuffer->clear();
283 /************************************************** *********/
284 gluseprogram(m_lighttogbufferprogram->getid());
285 m_gbuffer->bindframebuffer();
286 renderlights(lights,camera);
287 m_gbuffer->unbindframebuffer();
288 m_gbuffer->bindtextures();
289 gluseprogram(m_deferredshadingprogram->getid());
290 setcameralight(camera);
291 drawquad();
292 gldisable(gl_blend);
293 m_gbuffer->clear();
294 reset();
295 }

ei05tbe
08-07-2010, 03:14 AM
seems like I am having a blending issue. I have 3 different directional lights on blue coming in from the front, one red from the left and one green from the right. They are stored in order lights[0] = blue, lights[1] = green and lights[2] = red.

When all three lites are applied when I render the quad only the blue(index 0) are visible. If I turn of the blue light. Only index 1(the red one) are visible. To see the green light(index 2), I have to turn of light index 0 and 1.

All three lights.
http://forumbilder.se/images/e12010121340Pfedb.jpg (http://forumbilder.se)

Light 0 an 1.
http://forumbilder.se/images/a42010120814P6472.jpg (http://forumbilder.se)

Light 0 off, 1 and 2 on.
http://forumbilder.se/images/1f2010121049P8f75.jpg (http://forumbilder.se)

Light 0 and 1 off, 2on.
http://forumbilder.se/images/182010121239P0f85.jpg (http://forumbilder.se)


Edit:
39 void Light::apply(const GLuint light){
40 /*
41 std::cout << "Applying new light "<< std::endl;
42 std::cout << light << std::endl;
43 std::cout << m_position << std::endl;
44 std::cout << m_ambient << std::endl;
45 std::cout << m_diffuse << std::endl;
46 std::cout << m_specular<< std::endl;*/
47 glLightfv(light, GL_POSITION, m_position.ptr());
48 glLightfv(light, GL_AMBIENT, m_ambient.ptr());
49 glLightfv(light, GL_DIFFUSE, m_diffuse.ptr());
50 glLightfv(light, GL_SPECULAR, m_specular.ptr());
51 }


Code for applying each lite. I did a print and the values seems correct.

Ilian Dinev
08-07-2010, 09:08 AM
glClear() is governed by a lot of stuff: you should have depth-write/test enabled, the viewport should cover the cleared area, etc.

Why do you bind and unbind the FBO around glClear? The unbind seems out of place.

ei05tbe
08-07-2010, 12:09 PM
The problem was that GL_DEPTH_TEST was enabled when drawing the quad in the loop. The problem is solved.

Thanks!