概念:glDrawBuffer和glDrawBuffers有啥用?

Posted

技术标签:

【中文标题】概念:glDrawBuffer和glDrawBuffers有啥用?【英文标题】:Concept: what is the use of glDrawBuffer and glDrawBuffers?概念:glDrawBuffer和glDrawBuffers有什么用? 【发布时间】:2018-06-25 18:51:55 【问题描述】:

当我遇到这两种方法时,我正在阅读红皮书 OpenGL 编程指南,这让我觉得没有必要,因为我们已经可以使用 layout (location = )glBindFragDataLocation 指定输出将转到哪个颜色缓冲区。我在这里有什么误解吗?

【问题讨论】:

IIRC,除非你调用glDrawBuffers,否则你只能渲染到第0个帧缓冲附件,不管layout (location = ...) 【参考方案1】:

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

例如假设您有一个带有 3 种颜色附件的帧缓冲区 GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT1GL_COLOR_ATTACHMENT2

片段着色器

layout (location = 0) out vec4 out_color1;
layout (location = 1) out vec4 out_color2;

drawbuffer 规范:

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 没有写入数据。

【讨论】:

以上是关于概念:glDrawBuffer和glDrawBuffers有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

Qt中的OpengL glDrawBuffers()?

FBO 和纹理

OpenGL FBO 多个纹理

FBO 深度缓冲区为红色

关于 Windows 上 OpenGL 中的多重缓冲的几个问题

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样