【问题标题】:How to query the depth of the OpenGL stencil buffer如何查询 OpenGL 模板缓冲区的深度
【发布时间】:2014-12-09 03:42:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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,事情会变得更加复杂。如果您需要,请查阅规范文档以了解确切的行为。

    【讨论】:

    • 谢谢。 glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER,GL_STENCIL,GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,&stencilSize) 无论配置如何都可以工作吗?我在文档中读到,参数因是否使用 FBO 而异。
    • 我为 FBO 添加了更多案例。
    • 我在 3.2 核心规范中搜索了 FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 并没有找到它,所以你的意思一定是一些更高版本的核心配置文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多