GL_TEXTURE_3D颜色和模板FBO附件

时间:2015-12-02 11:10:28

标签: opengl opengl-4

我正在使用OpenGL 4.3对屏幕外FBO进行layered rendering。我使用GL_TEXTURE_3D将多个图层作为COLOR附件。然后我在编写输出时使用几何着色器索引到不同的图层。它工作正常。现在我还需要用于模板测试的模板附件我在渲染过程中执行。首先我尝试附加一个渲染缓冲区,就像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);

宽度 - 纹理宽度,高度 - 纹理高度,深度 - 纹理3D内的图层数量。

//Attach to FBO:

 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, texId, 0));

这样做我得到了:

  

GL_FRAMEBUFFER_INCOMPLETE

     

INVALID_OPERATION

我已经搜索了任何可能的例子来找到如何进行这样的设置,但什么都没找到。I also tried to use GL_TEXTURE_2D_ARRAY instead,but same problem.(由于某种原因,这实际上解决了我早期测试中持续存在的问题)

更新

我的错误在调试过程中与我的一些调查结果相混淆。基本上我上面写的一半可以丢弃。但是因为其他人可能会遇到同样的问题,我会解释发生了什么。

首先,当我将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 < / strong>导致INVALID_OPERATION(随意发布答案),此更改已解决问题。

1 个答案:

答案 0 :(得分:3)

根据规范,GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS表示(引自OpenGL 4.5规范):

  

如果任何帧缓冲附件已分层,则必须对所有填充的附件进行分层。此外,所有填充的颜色附件必须来自同一目标的纹理(三维,一维或二维数组,立方体贴图或立方体贴图数组纹理)。

基于此的第一部分,您最初尝试使用带有分层3D纹理颜色附件的单层模板附件显然是非法的。

第二部分听起来有点不清楚。由于它只涉及&#34;颜色附件&#34;,它表明使用GL_TEXTURE_3D颜色附件和GL_TEXTURE_2D_ARRAY模板附件是合法的。但我并不相信这实际上是意图。不幸的是,我无法在规范的其余部分找到对此的额外确认。

GL_TEXTURE_3D用于模板或深度/模板纹理是非启动性的。没有3D模板纹理这样的东西。从4.5规范,第194页中的第191-192页&#34; 8.5纹理图像规范&#34;

  

与DEPTH_COMPONENT,DEPTH_STENCIL,或STENCIL_INDEX的基部内部格式纹理由纹理图像SPECI音响阳离子支持的命令仅当目标是TEXTURE_1D,TEXTURE_2D,TEXTURE_2D_MULTISAMPLE,TEXTURE_1D_ARRAY,TEXTURE_2D_ARRAY,TEXTURE_2D_MULTISAMPLE_ARRAY,TEXTURE_RECTANGLE,TEXTURE_CUBE_MAP,TEXTURE_CUBE_MAP_ARRAY,PROXY_TEXTURE_1D,PROXY_TEXTURE_2D,PROXY_TEXTURE_2D_MULTISAMPLE ,PROXY_TEXTURE_1D_ARRAY,PROXY_TEXTURE_2D_ARRAY,PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY,PROXY_TEXTURE_RECTANGLE,PROXY_TEXTURE_CUBE_MAP或PROXY_TEXTURE_CUBE_MAP_ARRAY。

这是一个很长的列表,但TEXTURE_3D不在其中。

基于此,我相信你发现的工作是唯一的选择。对于颜色和模板附件,您需要使用目标为GL_TEXTURE_2D_ARRAY的纹理。