1

我总共有 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 评论的固定代码

4

3 回答 3

3

是的,这就是工作原理glDrawBuffers。但这是有原因的。

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

于 2013-02-24T23:30:44.087 回答
1

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

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

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

于 2013-02-24T22:09:26.207 回答
0

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

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

于 2013-07-23T09:17:13.860 回答