当我遇到这两种方法时,我正在阅读红皮书OpenGL编程指南,这对我来说是不必要的,因为我们已经可以使用layout (location = )
或{{1 }}。我在这里误会什么吗?
答案 0 :(得分:6)
并非所有附加到帧缓冲区的颜色附件都必须由着色器程序渲染。 glDrawBuffers
指定要绘制的颜色缓冲区列表。
例如假设您有一个带有三个颜色GL_COLOR_ATTACHMENT0
,GL_COLOR_ATTACHMENT1
和GL_COLOR_ATTACHMENT2
的frambuffer:
片段着色器
layout (location = 0) out vec4 out_color1;
layout (location = 1) out vec4 out_color2;
drawbufferr规范:
const GLenum buffers[]{ GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT0 };
glDrawBuffers( 2, buffers );
out_color1
将其数据发送到索引为0的绘制缓冲区(由于location = 0
声明)。上面对glDrawBuffers
的调用将此缓冲区设置为GL_COLOR_ATTACHMENT2
。同样,out_color2
将其数据发送到索引1,该索引设置为GL_COLOR_ATTACHMENT0
。附件1没有写入数据。