在CPU中对各个MSAA样本进行后处理

时间:2017-05-11 12:31:51

标签: opengl msaa

我对子像素采样感兴趣,我的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次进行超级采样,从而恢复单个样本,但这似乎是一种非常低效的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以编写一个计算着色器,读取样本并通过imageLoad写入每个样本的数据,然后将其写入SSBOs(FS输出和image load/store不适合输出)。在需要阅读时,您需要通常的内存屏障同步,但这样,您可以直接写入buffer object,而不必使用PBO to read from a texture

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