OpenGL MRT glDrawBuffers()参数编号和行为

时间:2013-02-24 22:00:00

标签: c++ opengl rendering textures fbo

我总共有5个渲染目标。我使用相同的着色器写入前4个,然后在单独的传递中写入最后一个。

在调用渲染到前4个目标之前,我调用:

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1,  GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, drawBuffers);

然而,当我把它称为第二遍并且只想写入最后一个,第五个目标时,为什么下面会给出奇怪的结果?

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT4 };
glDrawBuffers(1, drawBuffers);

为什么我必须改为使用:

GLenum drawBuffers[] = { GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT4 };
glDrawBuffers(5, drawBuffers);

这是glDrawBuffers()的工作原理,还是由其他东西引起的?

编辑:关于Jarrods评论的固定代码

3 个答案:

答案 0 :(得分:3)

是的,这只是how glDrawBuffers works。但这是有原因的。

片段着色器会写出映射到某些“颜色编号”的颜色输出。它们与GL_COLOR_ATTACHMENT''i''的数字无关系glDrawBuffers的整个点是将这些片段颜色编号映射到帧缓冲区中的实际缓冲区。

答案 1 :(得分:1)

http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffers.xml

第二个参数必须是类型const GLenum*,即一个指针"指向一个符号常量数组,指定将写入片段颜色或数据值的缓冲区"。

所以只是传递GL_COLOR_ATTACHMENT4作为第二个参数是错误的类型。您需要将指针传递给GLEnum

数组

答案 2 :(得分:0)

我发现glDrawBuffers()中出现了问题。 例如 tmp = {attement_color0,attachement_color2} glDrawBuffers(TMP)。 在着色器中: gl_fragdata [0] = ... gl_fragdata [2] = ...

或者你可以使用布局位置来定义attments输出。 但有时候,至少在我的电脑中,它不起作用。我的意思是attachment_color2没有确切的输出。