将模板渲染缓冲区绑定到opengl中的帧缓冲区

Posted

技术标签:

【中文标题】将模板渲染缓冲区绑定到opengl中的帧缓冲区【英文标题】:Binding a stencil render buffer to a frame buffer in opengl 【发布时间】:2012-06-18 14:27:22 【问题描述】:

有没有人成功地做到了这一点?似乎我在模板渲染缓冲区glCheckFramebufferStatus(...) 中使用的任何索引格式都会返回GL_FRAMEBUFFER_UNSUPPORTED。 我已经成功地绑定了一个深度\颜色渲染缓冲区,但是每当我尝试对我的模板缓冲区做同样的事情时,我都会得到(正如我所说)GL_FRAMEBUFFER_UNSUPPORTED

这是我的代码的 sn-ps:

// Create frame buffer
GLuint fb;
glGenFramebuffers(1, &fb);

// Create stencil render buffer (note that I create depth buffer the exact same way, and It works.
GLuint sb;
glGenRenderbuffers(1, &sb);
glBindRenderbuffer(GL_RENDERBUFFER, sb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h);

// Attach color
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0);

// Attach stencil buffer
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rb);
// And here I get an GL_FRAMEBUFFER_UNSUPPORTED when doing glCheckFramebufferStatus()

有什么想法吗?

注意:颜色附件是纹理而不是渲染缓冲区

【问题讨论】:

【参考方案1】:

切勿使用独立的模板缓冲区。如果您需要模板,请始终使用depth+stencil image format。请注意,模板索引格式不是required image formats。

即使您在这里没有使用深度缓冲区,您仍然应该使用GL_DEPTH24_STENCIL8,您应该将其附加到GL_DEPTH_STENCIL_ATTACHMENT​

【讨论】:

+1 嗯,我想我试过了,但没有用,但是它可以在我家里的 ATI 卡上工作,如果我在工作时让它在我的 nvidia 上工作,我会给你答案绿色:) @ViktorSehr:可能不是模板;你的纹理使用什么图像格式? @Viktor,模板是否用作独立缓冲区? Nicol,如果我需要模板和颜色,我可以选择什么? @elect:我的回答很清楚您使用的是什么:组合的深度/模板图像。您只需忽略它的深度部分。 @NicolBolas 我对此有一个问题:如果我指定深度渲染缓冲区和模板,那么我是否还应该将格式 GL_DEPTH24_STENCIL8 指定到深度缓冲区?还有 GL_DEPTH_STENCIL_ATTACHMENT?还是像往常一样使用 GL_DEPTH_ATTACHMENT 和 GL_DEPTH_COMPONENT24 创建深度缓冲区?【参考方案2】:

您可以在最近的 nvidia 硬件/驱动程序上仅使用模板

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, fboStencilTexture, 0);

仍然不支持单独的深度和模板

【讨论】:

以上是关于将模板渲染缓冲区绑定到opengl中的帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

无法从 OpenGL 中的着色器访问先前渲染的纹理

OpenGL(FBO)中的普通后台缓冲区+渲染到深度纹理

如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?

计算机图形学(OPENGL):帧缓冲

opengl - 比我设置的更小的帧缓冲纹理?

Opengl渲染到深度纹理 - 红色?