【问题标题】:OpenGL MRT glDrawBuffers() argument numbers and behaviorOpenGL MRT glDrawBuffers() 参数编号和行为
【发布时间】:2013-02-24 21:59:59
【问题描述】:

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

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

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

但是,当我调用它进行第二遍并且只想写入最后一个,即第 5 个目标时,为什么下面会给出奇怪的结果?

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 评论的固定代码

【问题讨论】:

    标签: c++ opengl rendering textures fbo


    【解决方案1】:

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

    片段着色器写入映射到特定“颜色编号”的颜色输出。这些与 GL_COLOR_ATTACHMENT''i'' 数字没有关系glDrawBuffers 的全部意义在于将这些片段颜色编号映射到帧缓冲区中的实际缓冲区。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 对不起,在我的代码中,我实际上将它作为 1 个元素数组,正如你所说,我只是想在我的问题中更简洁。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多