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

时间:2013-11-25 06:33:15

标签: opengl glsl

如果我将纹理数组(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: My Fragment着色器仅写入第一个颜色缓冲区。 (location = 0。)

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

原因是你根本不使用分层渲染。 glFramebufferTextureLayer(..., n)正在做的是绑定数组纹理的单个层。

你这样做4次,将4个单层的一个纹理(但这无关紧要,这可能是4个单独的正常纹理)绑定到4个附件,没有分层。您需要glFramebufferTexture,而不是glFramebufferTextureLayer

另一方面,当你实际上只有一层时,你正在向gl_Layer写下4个不同的值。