将模板渲染缓冲区绑定到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中的帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章