我有一个对OpenGL模板缓冲区的位深度有最低要求的函数。如果当前模板缓冲区不满足该要求(或者没有模板缓冲区),我希望该函数返回错误。由于不推荐使用GL_STENCIL_BITS,查询模板缓冲区的位深度的正确方法是什么?
答案 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,事情会变得复杂一些。如果您需要,请参阅规范文档以了解具体行为。