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

C++ OpenGL MRT glDrawBuffers()参数编号和行为,c++,opengl,rendering,textures,fbo,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); 然而,当我将其称为第二次通过,并且只想写入最后一个目标,即第五个目标时,为什么下面给

我总共有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的工作原理,还是由其他原因引起的

编辑:修复了带有注释的代码

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

因此,仅将GL_COLOR_ATTACHMENT4作为第二个参数传递是错误的类型。您需要传递一个指向GLEnum数组的指针

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

因此,仅将GL_COLOR_ATTACHMENT4作为第二个参数传递是错误的类型。您需要传递一个指向格伦数组的指针。

是的,这很简单。但这是有原因的

片段着色器写入映射到特定颜色编号的颜色输出。这些与GL_颜色_附件编号无关。glDrawBuffers的整个要点是将这些片段颜色编号映射到帧缓冲区中的实际缓冲区。

是的,这很简单。但这是有原因的


片段着色器写入映射到特定颜色编号的颜色输出。这些与GL_颜色_附件编号无关。glDrawBuffers的全部目的是将这些片段颜色编号映射到帧缓冲区中的实际缓冲区。

我发现glDrawBuffers中存在一些错误。 例如 tmp={attement_color0,attachement_color2} glDrawBufferstmp。 在着色器中: gl_fragdata[0]=。。。 gl_fragdata[2]=

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

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

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

对不起,在我的代码中,我实际上把它作为一个元素数组,正如你所说,我只是想在我的问题中更加简洁。对不起,在我的代码中,我实际上把它作为一个元素数组,正如你所说,我只是想在我的问题中更加简洁。