【问题标题】:Multiple texture output data in fragment shader片段着色器中的多个纹理输出数据
【发布时间】: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);

我很确定这最后一步是不“工作”的一步,但也许我需要别的东西。我已经尝试查找它但我没有找到任何文档,无论如何如果确实有一些与此相关的论文,那将非常有帮助。

【问题讨论】:

    标签: opengl glsl shader gpgpu


    【解决方案1】:

    ...但到目前为止,我无法使用两个输出变量使其运行,因为其中只有一个实际工作...

    当您想在片段着色器中写入多个目标时,您错过的最后一步是指定要绘制到的颜色缓冲区列表。 这可以通过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。 对于两者的默认帧缓冲区 和 framebuffer 对象,非零的片段颜色的绘制缓冲区的初始状态是 NONE。

    【讨论】:

    • 谢谢,现在可以完美运行了。有趣的是我尝试了 glDrawBuffers 但方法不正确。
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2019-01-23
    • 2014-06-20
    相关资源
    最近更新 更多