如果我将纹理阵列(GL_TEXTURE_2D_ARRAY
)的各个层绑定到不同的颜色附件点(例如,我将纹理数组"textureName"的4层绑定到颜色附件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层包含什么?
通过这两种情况,我试图了解分层渲染是否对多个渲染目标有任何影响。
在任何一种情况下,都会调用未定义的行为,因为gl_Layer
超出了界限。因此,任何附件的内容都是未定义的。它可能是任何东西,很可能是清澈的颜色。
如果您拥有《红皮书》第8版,请参阅第556至558页。
原因是根本不使用分层渲染。glFramebufferTextureLayer(..., n)
正在做的是绑定数组纹理的单个层。
你要做4次,将一个纹理的4个单层(但这无关紧要,也可以是4个单独的普通纹理)绑定到4个未分层的附件上。你需要glFramebufferTexture
,而不是glFramebufferTextureLayer
。
另一方面,当实际上只有一层时,您正在向gl_Layer
写入4个不同的值。