概念:glDrawBuffer和glDrawBuffers有什么用?

Man*_*yen 5 opengl glsl

我读红宝书OpenGL的编程指南,当我遇到这两种方法,这在我看来是不必要的,因为我们已经可以指定的输出会去与颜色缓冲区layout (location = )glBindFragDataLocation.我在这里误解了什么吗?

Rab*_*d76 8

并非所有附加到帧缓冲区的颜色附件都必须由着色器程序渲染.glDrawBuffers指定要绘制的颜色缓冲区列表.

例如,假设您有一个带有3种颜色附件的frambuffer GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1并且GL_COLOR_ATTACHMENT2:

片段着色器

layout (location = 0) out vec4 out_color1;
layout (location = 1) out vec4 out_color2;
Run Code Online (Sandbox Code Playgroud)

drawbufferr规格:

const GLenum buffers[]{ GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT0 };
glDrawBuffers( 2, buffers );
Run Code Online (Sandbox Code Playgroud)

out_color1将其数据发送到索引0处的绘制缓冲区(因为location = 0声明).对glDrawBuffers上面的调用将此缓冲区设置为GL_COLOR_ATTACHMENT2.同样,out_color2将其数据发送到索引1,该索引设置为GL_COLOR_ATTACHMENT0.附件1不会将数据写入其中.