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

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

这两个纹理应该存储我的输出数据(每个纹理应该是一个变量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);

我相信最后一步是无法“工作”的,但也许我需要其他的东西。我已经试图查找相关文档,但没有找到任何文档。如果确实有与此相关的文件,那将非常有帮助。

1个回答

2

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

当您想要在片段着色器中写入多个目标时,您所错过的最后一步是指定要绘制的颜色缓冲区列表。这可以通过使用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 核心配置规范; 17.4.1 选择写入缓冲区; 第513页

17.4.1 Selecting Buffers for Writing

.....

The set of buffers of a framebuffer object to which all fragment colors are written is controlled with the commands

void DrawBuffers( sizei n, const enum *bufs );
void NamedFramebufferDrawBuffers( uint framebuffer, sizei n, const enum *bufs );

.....

For framebuffer objects, in the initial state the draw buffer for fragment color zero is COLOR_ATTACHMENT0. For both the default framebuffer and framebuffer objects, the initial state of draw buffers for fragment colors other then zero is NONE.


谢谢,现在它完美地工作了。有趣的是我尝试了 glDrawBuffers 但方式不正确。 - Mr Nobody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接