我正在使用OpenGL 4.3对屏幕外FBO进行分层渲染。我使用了GL_TEXTURE_3D和几个层作为COLOR附件。然后,在编写输出时,我使用几何体着色器索引到不同的层中。它工作正常。现在我还需要模具附件,以便在渲染过程中进行模具测试。首先,我尝试像2D附件那样附加渲染缓冲区。
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, _stencilBuffer)
在这种情况下,当检查FBO的完整性时,我得到了帧缓冲区错误:
GL_FRAMEBUFFER_complete_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));
这样做我得到:
GL_FRAMEBUFFER_INCOMPLETE操作无效
我搜索了任何可能的例子来找到应该如何进行这样的设置,但一无所获。
(由于某种原因,这实际上解决了我早期测试中持续存在的问题)I also tried to use GL_TEXTURE_2D_ARRAY instead,but same problem.
更新
在调试过程中,我的错误与我的一些发现混淆了。我上面写的基本上有一半可以丢弃。但由于其他人可能会遇到同样的问题,我将解释发生了什么。
起初,当我将三维纹理附加到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);
哪个抛出:
操作无效
现在,我尝试了GL_TEXTURE_3D目标,而不是GL_TEXTURE_2D_ARRAY,这最终导致FBO完成。因此,尽管我仍然想了解GL_TEXTURE_3D为什么会导致INVALID_OPERATION(请随意发布答案),但这一更改已经解决了问题。
基于规范,GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS
表示(引用自OpenGL 4.5规范):
如果对任何帧缓冲区附件进行了分层,则必须对所有填充的附件进行分层。此外,所有填充的颜色附件必须来自同一目标的纹理(三维、一维或二维阵列、立方体贴图或立方体贴图阵列纹理)。
基于第一部分,您最初尝试使用单层模板附件和分层3D纹理颜色附件显然是非法的。
第二部分听起来有点不清楚。由于它只谈到"颜色附件",它建议使用GL_TEXTURE_3D
颜色附件和GL_TEXTURE_2D_ARRAY
模版附件是合法的。但我不相信这是真正的意图。不幸的是,我在规范的其余部分找不到对此的额外确认。
将GL_TEXTURE_3D
用于模具或深度/模具纹理是不可行的。没有3D模具纹理这样的东西。来自4.5规范第191-192页"8.5纹理图像规范"部分
只有当目标为texture_1D、texture_2D、texture_2D_MMULTISAMPLE、texture_1D_ARRAY、texture-2D_ARRAY、texture_2D_MULTISAMPE_ARRAY、TEXTUR_RECTANGLE、TEXTURT_CUBE_MAP、TEXTUR_CUBE_MAP_ARRAY、PROXY_texture_1D_,PROXY_TEXTURE_2D_MULTISAMPLE、PROXY_TEXTURE_1D_ARRAY、PROXY_TEXTURE_2D_ARRAY,PROXY_TEXTURE_RETANGLE、PROXY_TEXTURE_CUBE_MAP或PROXY_TXTURE_CUBE_MAP_ARRAY。
这是一个很长的列表,但TEXTURE_3D
不在其中
基于此,我相信你发现有效的方法是唯一的选择。您需要将纹理与目标GL_TEXTURE_2D_ARRAY
一起用于颜色和模具附件。