PDA

View Full Version : FBO and stencil



-Ekh-
11-29-2009, 04:42 AM
Hello,

how to use the stencil buffer inside an FBO ? Do you have any examples or good lectures ?

Thanks.

datsua
11-29-2009, 08:46 AM
You can use a FBO that has a GL_DEPTH24_STENCIL8 render buffer attachment.



const GLint FBO_WIDTH = 1024;
const GLint FBO_HEIGHT = 768;

GLuint color_buffer_id, depth_stencil_id, fbo_id;
GLenum status;

// create a texture we use as the color buffer
glGenTextures(1, &color_buffer_id);
glEnable(GL_TEXTURE2D);
glBindTexture(GL_TEXTURE_2D, &color_buffer_id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

// create a renderbuffer for the depth/stencil buffer
glGenRenderbuffers(1, &depth_stencil_id);
glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil_id);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, FBO_WIDTH, FBO_HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT_0, GL_TEXTURE_2D, color_buffer_id, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth_stencil_id);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if ( GL_FRAMEBUFFER_COMPLETE != status )

{
// something went wrong :(
}
else
{
// profit :)
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);

-Ekh-
11-29-2009, 03:14 PM
Well thanks !

And now, in the "else" part, can I use it as in a normal stencil test ?

datsua
11-30-2009, 08:07 AM
That's right.