GL_TEXTURE_3D 颜色和模板 FBO 附件

GL_TEXTURE_3D color and stencil FBO attachments

我正在做一个 layered rendering to an offscreen FBO using OpenGL 4.3.I used GL_TEXTURE_3D 有几个图层作为 COLOR attachment.Then 我在编写 output.It 作品时使用几何着色器索引到不同的图层 ok.Now 我也需要我在 rendering.First 期间执行的模板测试的模板附件 我尝试只附加一个渲染缓冲区,就像 2D 附件一样。

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, _stencilBuffer)

在这种情况下,当检查 FBO 的完整性时,我收到帧缓冲区错误:

GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB

然后我假设如果颜色附件是 3D,那么模板附件也必须是 3D.And 因为没有 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>我也尝试使用 <a href="https://www.opengl.org/wiki/Array_Texture" rel="nofollow noreferrer">GL_TEXTURE_2D_ARRAY</a>,但同样的问题.(出于某种原因,这实际上解决了我之前测试中一直存在的问题)

更新

我的错是我在 debug.Basically 上面写的一半内容中与我的一些发现混淆了 discarded.But 因为其他人可能会遇到同样的问题我会解释发生了什么。

起初,当我将 3d 纹理附加到 FBO 的颜色附件时,我为 GL_DEPTH_STENCIL 创建了一个渲染缓冲区 attachment.And 是的,在完整性检查中我得到:

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 成为 complete.So,虽然我仍然想了解为什么 GL_TEXTURE_3D 导致 INVALID_OPERATION(欢迎 post 回答),但此更改已解决了问题。

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

If any framebuffer attachment is layered, all populated attachments must be layered. Additionally, all populated color attachments must be from textures of the same target (three-dimensional, one- or two-dimensional array, cube map, or cube map array textures).

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

我觉得第二部分有点不清楚。由于它只讨论 "color attachments",因此建议使用 GL_TEXTURE_3D 颜色附件和 GL_TEXTURE_2D_ARRAY 模板附件是合法的。但我不相信这实际上是意图。不幸的是,我在规范的其余部分找不到对此的额外确认。

GL_TEXTURE_3D 用于模板或depth/stencil 纹理是行不通的。没有 3D 模板纹理这样的东西。来自 4.5 规范,“8.5 纹理图像规范”部分的第 191-192 页

Textures with a base internal format of DEPTH_COMPONENT, DEPTH_STENCIL, or STENCIL_INDEX are supported by texture image specification commands only if target is 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, or PROXY_TEXTURE_CUBE_MAP_ARRAY.

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

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