2

我对我的 OpenGL 围绕我的网格的边缘轮廓进行亚像素采样感兴趣,以用于计算机视觉任务。我正在考虑使用 MSAA 来有效地做到这一点(但该应用程序不适用于抗锯齿)。我发现多重采样的问题是,为了从 GPU 读取样本,我只能将帧缓冲区 blit 到非多重采样的帧缓冲区中,因此我无法恢复单个样本信息。我的问题是:

  • 有没有办法实现存储每个样本(GL_SAMPLE_SHADING)计算结果的片段着色器,以便我可以将这些样本读回CPU?我曾想过使用 glSampleID 将输出索引到不同的输出缓冲区,但不知道这是否可能。也许像用于 OIT 的链表结构这样的方法(即http://on-demand.gputechconf.com/gtc/2014/presentations/S4385-order-independent-transparency-opengl.pdf)?但是,它们在 GPU 上执行所有计算,所以我不确定是否可以以任何方式从 CPU 读取链表数据。

也许 MSAA 是错误的方法,还有其他方法可以这样做。我想我最后的手段是对渲染 x 次进行超级采样,从而恢复单个样本,但这似乎是一个非常低效的解决方案。

4

1 回答 1

1

您可以编写一个计算着色器,它读取样本并通过 写入每个样本的数据imageLoad,然后将其写入SSBO(FS 输出和图像加载/存储不适用于输出)。在读取它时,您将需要通常的内存屏障同步,但是通过这种方式,您可以直接写入缓冲区对象,而不必使用PBO 从纹理中读取

最难的部分是将gl_GlobalInvocationID其他计算着色器输入转换为 SSBO 数组中的索引以及操作的纹理坐标和样本索引imageLoad

于 2017-05-11T15:11:19.500 回答