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