GL_TEXTURE_3D 颜色和模板 FBO 附件

Posted

技术标签:

【中文标题】GL_TEXTURE_3D 颜色和模板 FBO 附件【英文标题】:GL_TEXTURE_3D color and stencil FBO attachments 【发布时间】: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 哦,伙计!你回来了!我们想念你 :) 【参考方案1】:

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

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

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

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

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

与DEPTH_COMPONENT,DEPTH_STENCIL,或STENCIL_INDEX的基部内部格式纹理通过仅当目标是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纹理图像SPECI音响阳离子命令支持、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 的纹理作为颜色和模板附件。

【讨论】:

以上是关于GL_TEXTURE_3D 颜色和模板 FBO 附件的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:使用多个纹理渲染到 FBO

glReadPixels 可以用来从 GL_TEXTURE_3D 读取图层吗?

FBO 用于分离纹理

GL_TEXTURE_3D 是啥意思?

使用 GL_TEXTURE_2D_ARRAY 作为绘制目标

我可以避免将模板缓冲区从 FBO 传送到后台缓冲区吗?