【发布时间】:2014-12-09 03:42:44
【问题描述】:
我有一个函数对 OpenGL 模板缓冲区的位深度有最低要求。如果当前模板缓冲区不满足该要求(或者如果没有模板缓冲区),我希望该函数返回错误。由于不推荐使用 GL_STENCIL_BITS,那么查询模板缓冲区的位深度的正确方法是什么?
【问题讨论】:
标签: opengl opengl-es-2.0 opengl-3
我有一个函数对 OpenGL 模板缓冲区的位深度有最低要求。如果当前模板缓冲区不满足该要求(或者如果没有模板缓冲区),我希望该函数返回错误。由于不推荐使用 GL_STENCIL_BITS,那么查询模板缓冲区的位深度的正确方法是什么?
【问题讨论】:
标签: opengl opengl-es-2.0 opengl-3
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,事情会变得更加复杂。如果您需要,请查阅规范文档以了解确切的行为。
【讨论】:
FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 并没有找到它,所以你的意思一定是一些更高版本的核心配置文件。