如何查询OpenGL模板缓冲区的深度

时间:2014-12-09 03:42:44

标签: opengl opengl-es-2.0 opengl-3

我有一个对OpenGL模板缓冲区的位深度有最低要求的函数。如果当前模板缓冲区不满足该要求(或者没有模板缓冲区),我希望该函数返回错误。由于不推荐使用GL_STENCIL_BITS,查询模板缓冲区的位深度的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

OpenGL ES 2.0仍然有GL_STENCIL_BITS。所以这适用于默认的帧缓冲区:

GLint stencilBits = 0;
glGetIntegerv(GL_STENCIL_BITS, &stencilBits);

对于FBO,您通常应该知道自创建它以来是否有模板缓冲区以及它有多深。但是如果你需要查询它:

GLint bufId = 0;
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
    GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &bufId);
GLint stencilSize = 0;
if (bufId != 0) {
    glBindRenderbuffer(GL_RENDERBUFFER, bufId);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
        GL_RENDERBUFFER_STENCIL_SIZE, &stencilSize);
}

对于OpenGL核心配置文件,这是获取默认帧缓冲区的模板缓冲区的位数的新方法:

GLint stencilSize = 0;
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER,
    GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &stencilSize);

以及当前绑定的FBO:

GLint stencilSize = 0;
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER,
    GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &stencilSize);

对于ES 3.0,根据规范看起来支持这两个选项。

对于具有组合深度/模板附件的FBO,事情会变得复杂一些。如果您需要,请参阅规范文档以了解具体行为。