我试图使用GPU解决一个算法,并使用着色器实现这一目的(不是计算着色器,只是顶点和片段着色器)。为此,我在我的片段着色器中需要两个输出变量来提取数据。对于输入数据,我没有问题(它可以完美地工作),但到目前为止,我无法使用两个输出变量使其运行,因为其中只有一个实际上起作用,或者在它们之间发生了一些奇怪的事情。
我还希望这个问题成为GPGPU中片段着色器多个输出的参考(因为迄今为止我所见的都是特定情况)。首先,我有两个纹理,我像这样加载它们:
这两个纹理应该存储我的输出数据(每个纹理应该是一个变量out)。在这两种情况下,我使用红色分量将数据存储为整数。
现在,我创建了一个帧缓冲并将这两个纹理绑定到帧缓冲中,每个纹理都是一个颜色附件。
现在,关于片段着色器,我按照以下方式设置了输出变量的位置:
最后,在我绑定相同的帧缓冲之后,我只需在渲染循环中调用DrawArrays()。
我还希望这个问题成为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);
这两个纹理应该存储我的输出数据(每个纹理应该是一个变量out)。在这两种情况下,我使用红色分量将数据存储为整数。
现在,我创建了一个帧缓冲并将这两个纹理绑定到帧缓冲中,每个纹理都是一个颜色附件。
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);
我相信最后一步是无法“工作”的,但也许我需要其他的东西。我已经试图查找相关文档,但没有找到任何文档。如果确实有与此相关的文件,那将非常有帮助。