具有默认帧缓冲区的多个输出缓冲区

Multiple output buffers with the default framebuffer

我有一个主要与具有两个颜色附件的 FBO 一起使用的着色器。在这个片段着色器中有两个输出缓冲区。

in vec2 vs_tex_coords;
flat in uint vs_id;

out vec4 fs_color;
out uint fs_id;

uniform sampler2D u_texture;

void main()
{
     fs_color = texture(u_texture, vs_tex_coords)
     fs_id = vs_id;
}

现在,因为我很懒,我想对默认的帧缓冲区重用相同的片段着色器。在这种情况下,显然只有一种颜色附件(即屏幕颜色缓冲区)。第二种颜色输出会发生什么?它是被忽略了还是会引起麻烦?标准中是否提到了这种情况?

我在两台设备上测试了该行为,它似乎工作正常。它只是忽略了第二个输出缓冲区。但是对于其他实现我能说些什么呢?

现在,我假设在您的主要 OpenGL 代码中的某处,您正在分配那些 fragment shader output variables to specific output locations。因为如果你不是,那么你已经依赖 implementation-defined 输出位置排序,那是 不可靠

以下假设fs_color分配到输出位置0,fs_id分配到输出位置1。您可以根据需要随意切换数字。

鉴于此,您问的问题实际上是关于 framebuffer's draw buffers state 的。这是指定哪些输出位置映射到帧缓冲区中哪些彩色图像的数组。所有的帧缓冲区,默认的和 FBO 都一样,都有这个映射 table。但是每个帧缓冲区的 table 是分开的。

因此,如果您没有对默认帧缓冲区进行 glDrawBuffers 等效调用以设置从输出位置到帧缓冲区图像的映射,则默认用来。默认情况下,绘图缓冲区状态分配位置 0 以写入 GL_BACK 缓冲区(如果不存在后台缓冲区,则为 GL_FRONT)。这里的规范实际上有点不明确,因为 other 位置的状态没有说明。我的猜测是它们将是 GL_NONE(因此 FS 写入被忽略)。