我尝试使用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);
这两个纹理应该存储我的输出数据(每个纹理应该是一个变量)在这两种情况下,我都使用红色组件将数据存储为整数。
现在我创建一个framebuffer并将这两个纹理绑定到framebuffer,每个纹理都在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);
我很确定最后一步是不是"工作"但也许我需要别的东西。我试着查一下但是我找不到任何文件,无论如何,如果有一些与之相关的文章,它会非常有帮助。
答案 0 :(得分:0)
...但到目前为止,我无法使用两个输出变量运行,因为其中只有一个实际工作...
如果要在片段着色器中写入多个目标,那么您错过的最后一步是指定要绘制的颜色缓冲区列表。
这可以通过glDrawBuffers
:
glBindFramebuffer(GL_FRAMEBUFFER, resultFBO);
GLenum drawBuffers[]={GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
提示:您可以使用glClearBuffer
清除帧缓冲区的各个缓冲区
见OpenGL 4.6 API Core Profile Specification; 17.4.1 Selecting Buffers for Writing; page 513:
17.4.1选择写入缓冲区
.....
所有片段颜色所在的帧缓冲区对象的缓冲区集 写入由命令控制
void DrawBuffers( sizei n, const enum *bufs ); void NamedFramebufferDrawBuffers( uint framebuffer, sizei n, const enum *bufs );
.....
对于帧缓冲对象,在初始状态下为绘制缓冲区 片段颜色零是COLOR_ATTACHMENT0。 对于默认的帧缓冲区 和帧缓冲对象,除零之外的片段颜色的初始绘制缓冲区状态为NONE。