【发布时间】:2018-05-17 14:21:05
【问题描述】:
我正在尝试使用 GPU 来解决算法,并且我正在使用着色器(不是计算着色器,只是顶点和片段着色器)。为此,我需要在我的片段着色器中使用两个输出变量来提取数据,我对输入数据没有任何问题(效果很好),但到目前为止,我无法让它与两个输出变量一起运行,因为其中只有一个实际上在工作或者他们两个之间发生了一些奇怪的事情。
我也希望这个问题可以作为这种做法的参考(GPGPU 的片段着色器中的几个输出),因为到目前为止我所看到的只是特定情况。 首先,我有两个纹理,我只加载一次,如下所示:
第一 纹理
glBindTexture(GL_TEXTURE_2D, texture[4]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, width, height,
0, GL_RED_INTEGER, GL_INT, 0);
第二 纹理
glBindTexture(GL_TEXTURE_2D, texture[5]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, width, height,
0, GL_RED_INTEGER, GL_INT, 0);
这两个纹理应该存储我的输出数据(每个纹理应该是一个变量)在这两种情况下,我都使用红色组件将数据存储为整数。
现在我创建一个帧缓冲区并将这两个纹理绑定到帧缓冲区,每个纹理都在一个 color_attachment 中。
glGenFramebuffers(1, &resultFBO); // frame buffer id
glBindFramebuffer(GL_FRAMEBUFFER, resultFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, texture[4], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL_TEXTURE_2D, texture[5], 0);
现在,对于片段着色器,我这样设置输出变量的位置:
layout(location = 0) out int resultFlow;
layout(location = 1) out int resultAccumFlow;
最后,在绑定相同的帧缓冲区后,我只需调用 DrawArrays()(在渲染循环中):
glBindFramebuffer(GL_FRAMEBUFFER, resultFBO);
// Render
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
我很确定这最后一步是不“工作”的一步,但也许我需要别的东西。我已经尝试查找它但我没有找到任何文档,无论如何如果确实有一些与此相关的论文,那将非常有帮助。
【问题讨论】: