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



如果我将纹理阵列(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个不同的值。

相关内容

最新更新