Opengl 使用默认帧缓冲区的多个输出缓冲区

Opengl 使用默认帧缓冲区的多个输出缓冲区,opengl,opengl-4,Opengl,Opengl 4,我有一个着色器,主要用于具有两个颜色附件的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; } 现在,由于我很懒,

我有一个着色器,主要用于具有两个颜色附件的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\u color
分配给输出位置0,将
fs\u id
分配给输出位置1。您可以根据自己的需要随意切换号码

鉴于此,你所问的问题实际上是关于。这是一个数组,用于指定帧缓冲区中哪些输出位置映射到哪些彩色图像。所有帧缓冲区(默认和FBO)都具有此映射表。但每个帧缓冲区的表是独立的


因此,如果您没有对默认帧缓冲区进行
glDrawBuffers
-等效调用以设置从输出位置到帧缓冲区图像的映射,则使用默认值。默认情况下,绘制缓冲区状态指定位置0写入
GL\u BACK
缓冲区(或
GL\u FRONT
,如果不存在后缓冲区)。由于没有说明其他位置的状态,因此这里的规范实际上有点不够规范。我的猜测是,它们可能是
GL_NONE
(因此FS写入被忽略)。

“在这种情况下,显然只有一种颜色附件(即屏幕颜色缓冲区)。”规程问题:默认帧缓冲区可能有(在使用辅助缓冲区时会有更多,但现在为什么要使用这些)。只是不是用户定义的纹理/渲染缓冲区。非常感谢您的清晰回答。你的前两个假设是正确的,对不起,问题太简单了。最后一个假设也是正确的,我不使用默认帧缓冲区调用
glDrawBuffers
。依赖默认分配是否通常是危险的?如果在我的情况下,我明确地将默认FBO的绘制缓冲区位置1设置为
GL_NONE
,我会解决任何可能的问题吗?