OpenGL中分层渲染和多个渲染目标之间的混淆

Posted

技术标签:

【中文标题】OpenGL中分层渲染和多个渲染目标之间的混淆【英文标题】:Confusion between Layered rendering and Multiple Render Targets in OpenGL 【发布时间】:2013-11-25 06:33:14 【问题描述】:

如果我将纹理数组 (GL_TEXTURE_2D_ARRAY) 的各个层绑定到不同的颜色连接点(例如,我将纹理数组的 4 层“textureName”绑定到颜色附件 0、1、2 和 3):

glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, textureName, 0, 0);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 1, textureName, 0, 1);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 2, textureName, 0, 2);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 3, textureName, 0, 3);

在几何着色器中,我使用gl_Layer 将顶点分配给不同的层。 (我只是在复制几何)

2 后续问题:

案例 1: 我的片段着色器只写入第一个颜色缓冲区。 (位置 = 0。)

4层纹理数组在程序执行结束时包含什么?是否发生了几何重复(因为使用了gl_Layer)或者最后 3 个纹理是空白的(因为我没有在片段着色器中写入其他颜色缓冲区)?

案例 2: 我写入片段着色器中的所有 4 个颜色缓冲区(位置 = 0、1、2、3)

4层纹理数组在程序执行结束时包含什么?

通过这两种情况,我试图了解分层渲染是否对多个渲染目标有任何影响。

【问题讨论】:

【参考方案1】:

在任何一种情况下,您都会调用未定义的行为,因为gl_Layer 超出了范围。因此,任何附件的内容都是未定义的。它可以是任何东西,很可能是透明的颜色。

如果您拥有第 8 版“红皮书”,请参阅第 556 至 558 页。

原因是您根本没有使用分层渲染。 glFramebufferTextureLayer(..., n) 所做的是绑定数组纹理的单层

您这样做了 4 次,将一个纹理的 4 个单层(但这无关紧要,这也可以是 4 个单独的普通纹理)绑定到 4 个未分层的附件。你需要glFramebufferTexture,而不是glFramebufferTextureLayer

另一方面,您正在向gl_Layer 写入 4 个不同的值,而实际上只有一层。

【讨论】:

以上是关于OpenGL中分层渲染和多个渲染目标之间的混淆的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 多目标渲染(MRT)

在 Windows XP 中使用多个视频卡进行 OpenGL 渲染

iOS OpenGL ES 2.0 VBO 混淆

ios的opengl究竟能不能在非主线程渲染

OpenGL 多重渲染目标 - 黑色输出

如何使用 openGL 在 android studio 中渲染 .dae(collada) 文件