我有一个着色器,主要用于具有两种颜色附件的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 代码中的某个地方,您将这些片段着色器输出变量分配给特定的输出位置。因为如果你不是,那么你已经依赖于实现定义的输出位置排序,这是不可靠的。
下面假定fs_color
分配给输出位置 0,fs_id
分配给输出位置 1。您可以根据需要随意切换号码。
鉴于此,您提出的问题实际上是关于帧缓冲区的绘制缓冲区状态。这是指定哪些输出位置映射到帧缓冲中的哪些彩色图像的数组。所有帧缓冲器(默认帧缓冲器和 FBO 帧)都有此映射表。但是每个帧缓冲的表是独立的。
因此,如果您没有对默认帧缓冲进行glDrawBuffers
等效调用来设置从输出位置到帧缓冲图像的映射,则使用默认值。默认情况下,绘制缓冲区状态分配位置 0 以写入GL_BACK
缓冲区(如果不存在后台缓冲区,则GL_FRONT
)。这里的规范实际上有点不足,因为没有说明其他位置的状态。我的猜测是它们会被GL_NONE
(因此 FS 写入被忽略)。