PDA

View Full Version : How do I render the Depth Buffer using FBOs?



CelticDaddio
03-21-2006, 08:13 PM
I have a test app that I wrote some months ago which used the NV Depth Texture extension. In the end what is rendered is the contents of the depth buffer. I want to modify this app to use FBOs. How can I do this using FBOs? Also, what is the relation between FBO and Render Buffers?

CD

lodder
03-22-2006, 01:14 AM
This is from the EXT_fbo spec, you might want to read it:

Also, what is the relation between FBO and Render Buffers?Again, from the EXT_fbo spec:


(3) As a consequence of issue (2), this extension adds the concept of
share-able, non-texturable renderable entitites that can be
used as color buffers, depth buffers, stencil buffers, etc.
The OpenGL spec refers to these entities as "logical buffers".
What should this spec call them?

RESOLUTION: "renderbuffer", (one word)

We could just call them "logical buffers", but is there a
better name?

The group considered:
logical buffer - possible, kind of general
render buffer - clear, (one word or two?)
renderable - clear, but may conflict with glx "drawable"
drawable - confusing: glx "drawable" == gl "framebuffer"
render surface - possible
render target - possible
image buffer - may get confused with Tex"Image"
image - may get confused with Tex"Image"
surface buffer - too verbose?
surface - too general
others???

The group felt "render buffer " (or possibly "renderbuffer")
provides for the clearest expression of the purpose for
these buffers.

We finally decided on "renderbuffer" because we didn't want
to use "render" as an adjective to describe a generic
buffer, but rather decided to coin a new compound word to
describe this concept.

ohms
03-24-2006, 03:15 AM
CelticDaddio. Would you mind if I post my question in your topic. I've gotten the same problem and searched for the solution for two days. I have written a code for casting shadow using shadow map. I have ever used FBO for creating depth texture before, so, I use it again in this program. Although, the code has a littile change from the previous, it doesn't work this time. I search through every posted topic about FBO and follow any suggessions in the forum but it still not work.

This is from my FBO generation and texture binding routine:

fbo = new FramebufferObject();
fbo->Bind();

glGenTextures(1, &offscnTexture);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, offscnTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT,
GL_FLOAT, 0);

fbo->AttachTexture(GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, offscnTexture);

fbo->IsValid();
FramebufferObject::Disable();This is how I render to depth texture:

// Render to texture
fbo->Bind();
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

camera.setUp(45.0, (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT, 1.0f, 1000.0f);
camera.setPosition(50.0, 100.0, 100.0);
camera.lookAt(0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

AddLight();
glEnable(GL_LIGHTING);

glRotatef(angle1++, 0.0, 1.0, 0.0);
teapot->render(SOLID);
FramebufferObject::Disable();

// Render to primary buffer
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Initialize view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(angle2, 0.0, 1.0, 0.0);

glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, offscnTexture);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(-0.8, -0.8);
glTexCoord2f(1.0, 0.0); glVertex2f(0.8, -0.8);
glTexCoord2f(1.0, 1.0); glVertex2f(0.8, 0.8);
glTexCoord2f(0.0, 1.0); glVertex2f(-0.8, 0.8);
glEnd();And this is the result:
http://www.cp.eng.chula.ac.th/~g47ntp/Files/FBO_problem.JPG

Can any one tell me what am I do wrong in this code.

jide
03-24-2006, 01:58 PM
This has been asked many times, make a search !

ohms
03-24-2006, 07:58 PM
Yeah I know this is asked many times because I make a lot of search not only this forum but also the google. But, you know, still I don't get why my code not work, after I've tried every suggestion and solution in this world. I think my problem does not come from a misconception in FBO. I think it in my code but I can't figure out where's the problem (if not because this problem is beyond my knowledge, it must be a very silly mistake I made). So, I need some one to point me out. Honesly, I'm not a man who asks some one help and sit back and wait for solution, I also do my resarch myself.

Brian Paul
03-29-2006, 05:17 PM
Ohms, did you enable depth testing? i.e. glEnable(GL_DEPTH_TEST)?

-Brian

jide
03-29-2006, 08:59 PM
Didn't want to hurt you. Did you looked at the specs ?

http://oss.sgi.com/projects/ogl-sample/registry/EXT/framebuffer_object.txt

Look at the examples.

Also, what does the validation test of the FBO returns ?