我对子像素采样感兴趣,我的OpenGL渲染了我的网格边缘轮廓,用于计算机视觉任务。我正在考虑使用MSAA来高效地完成它(但该应用程序不适用于抗锯齿)。我发现多重采样的问题是,为了从GPU读取样本,我只能将帧缓冲区blit为非多重采样,因此我无法恢复单个样本信息。我的问题是:
也许MSAA是错误的方法,还有其他方法可以做到这一点。我想我的最后一招是对渲染x次进行超级采样,从而恢复单个样本,但这似乎是一种非常低效的解决方案。
答案 0 :(得分:1)
您可以编写一个计算着色器,读取样本并通过imageLoad
写入每个样本的数据,然后将其写入SSBOs(FS输出和image load/store不适合输出)。在需要阅读时,您需要通常的内存屏障同步,但这样,您可以直接写入buffer object,而不必使用PBO to read from a texture。
最难的部分是将gl_GlobalInvocationID
和其他计算着色器输入转换为SSBO数组中的索引以及imageLoad
操作的纹理坐标和样本索引。