【发布时间】:2015-12-02 11:10:27
【问题描述】:
我正在使用 OpenGL 4.3 对屏幕外 FBO 执行layered rendering。我使用带有多个图层的GL_TEXTURE_3D 作为颜色附件。然后我在编写输出时使用几何着色器索引到不同的图层。它工作正常。现在我还需要在渲染期间执行的模板测试的模板附件。首先我尝试只附加一个渲染缓冲区,就像使用 2D 附件一样。
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, _stencilBuffer)
在这种情况下,当检查 FBO 的完整性时,我收到了帧缓冲区错误:
GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB
然后我假设如果颜色附件是 3D,那么模板附件也必须是 3D。由于没有 3D 渲染缓冲区,我尝试为 FBO 的深度模板槽附加 3D 纹理。
glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH24_STENCIL8, width, height, depth,
0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
其中 width - 纹理宽度,height- 纹理高度,depth- 纹理 3D 内的层数。
//Attach to FBO:
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, texId, 0));
这样做我得到了:
<s> GL_FRAMEBUFFER_INCOMPLETE</s>INVALID_OPERATION
我已经搜索了任何可能的示例以找到应该如何进行这样的设置,但一无所获。<s>I also tried to use @987654323@ instead,but same problem.</s>(出于某种原因,这实际上解决了我早期测试中持续存在的问题)
更新
我的错误是我在调试过程中与我的一些发现混淆了。基本上我上面写的一半可以被丢弃。但是因为其他人可能会遇到同样的问题,我会解释发生了什么。
起初,当我将 3d 纹理附加到 FBO 的 COLOR 附件时,我为 GL_DEPTH_STENCIL 附件创建了一个渲染缓冲区。是的,在完整性检查时我得到了:
GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB
接下来,我尝试了:
glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH24_STENCIL8, width, height, depth,
0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
哪个抛出:
INVALID_OPERATION
现在,我尝试了 GL_TEXTURE_2D_ARRAY 而不是 GL_TEXTURE_3D 目标,这最终导致 FBO 完成。所以,虽然我仍然想了解为什么 GL_TEXTURE_3D 导致 INVALID_OPERATION(请随意发布答案),此更改已解决问题。
【问题讨论】:
-
你能贴出你从 glCheckFramebufferStatus 得到的实际数字代码吗?
-
@NicolBolas 哦,伙计!你回来了!我们想念你 :)