片段着色器中的多个纹理输出数据

时间:2018-05-17 14:21:05

标签: opengl shader gpgpu

我尝试使用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);

我很确定最后一步是不是"工作"但也许我需要别的东西。我试着查一下但是我找不到任何文件,无论如何,如果有一些与之相关的文章,它会非常有帮助。

1 个答案:

答案 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。