在OpenGL中将模板渲染缓冲绑定到帧缓冲的操作

6

有人成功地做到了这一点吗?无论我在模板渲染缓冲区中使用什么索引格式,glCheckFramebufferStatus(...) 都会返回 GL_FRAMEBUFFER_UNSUPPORTED

我已经成功地绑定了深度/颜色渲染缓冲区,但是每当我尝试使用模板缓冲区进行相同的操作时,我都会得到(如我所说)GL_FRAMEBUFFER_UNSUPPORTED

以下是我的代码片段:

// 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()

有什么想法吗?

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

2个回答

8

永远不要使用独立的模板缓冲区。如果需要使用模板,请始终使用深度+模板图像格式。请注意,模板索引格式不是必需的图像格式

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


+1 嗯,我想我试过了但没成功,不过在我家的ATI显卡上可以运行,如果我能让它在我工作的nvidia显卡上运行,我会给你的答案点赞的 :) - Viktor Sehr
@ViktorSehr:可能不是模板;你用什么图像格式来制作纹理? - Nicol Bolas
@Viktor,模板是否作为独立缓冲区工作了?尼古拉,如果我需要模板和颜色,我可以选择什么? - elect
@elect:我的答案很清楚,你需要使用的是组合深度/模板图像。你只需要忽略其中的深度部分即可。 - Nicol Bolas
@NicolBolas 我有一个关于这个问题的提问:如果我在模板缓冲区中指定了深度渲染缓冲区,那么我是否也应该在深度缓冲区中指定GL_DEPTH24_STENCIL8格式?还是指定GL_DEPTH_STENCIL_ATTACHMENT呢?或者深度缓冲区像往常一样创建GL_DEPTH_ATTACHMENT和GL_DEPTH_COMPONENT24? - Michael IV
一如既往,Bolas先生总是有答案。在iOS上,即使定义了GL_STENCIL_INDEX8GL_STENCIL_INDEX8_OES,它们似乎根本不起作用(始终会得到GL_FRAMEBUFFER_UNSUPPORTED)。看来你必须使用深度+模板格式的GL_DEPTH24_STENCIL8_OES才能让模板缓冲区正常工作。 - bobobobo

1

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

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

仍然不支持分离的深度和模板缓冲区


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接