opengl - 我可以使用 OpenGL 计算着色器来解析多重采样纹理吗?

标签 opengl shader texture-mapping render-to-texture multisampling

我的应用程序将第一个场景渲染到绑定(bind)到 FBO 的纹理中,然后计算着色器对纹理图像进行一些处理并将其写入另一个纹理,然后我使用它来渲染第二个场景。一切都很好。

现在我想要消除第一个场景的锯齿,所以我创建了一个多重采样纹理并在渲染之前将其绑定(bind)到 FBO。在计算着色器中,我使用 imageLoad(buf, pos, sample)image2DMS 中读取(而不是 imageLoad(buf, pos)来自 image2D)读取所有样本并计算片段的平均值,但看起来所有样本都具有相同的值。

在我提取相关的代码并将它们组合成一个简单的测试程序之前,我想知道我是否理解多样本模型,以及我尝试做的是否均匀可能的。 2014 年 7 月,我一直在运行 Windows 7 的 nVidia GTX 660 和 OpenGL 4.3,驱动程序 9.18.13.4052。

最佳答案

我认为您应该了解多重采样 (MSAA) 和 super 采样 (SSAA) 之间的区别。

多重采样使用多重采样的深度和颜色目标。当您的几何基元被光栅化时,它会根据您确定其覆盖范围的所有样本进行检查。之后,每个像素只调用一次片段着色器,并将结果复制到每个覆盖的样本。因此,您只有一个片段着色器实例在运行,其中您的原语覆盖了像素内的所有样本。另一方面,当图元仅覆盖一个像素的一小部分时,仅针对该样本复制片段着色器颜色。因此,只有当图元覆盖该像素中的特定样本时,您才能在一个像素中收集 n 个样本的不同颜色。

super 采样更容易理解并且需要更多的计算能力。 super 采样为每个样本调用一个片段着色器实例。因此,即使相同的图元覆盖同一像素中的所有样本,您也会得到不同的颜色。

在 OpenGL 中,您可以使用 glMinSampleShading 选项从 MSAA 无缝移动到 SSAA。此设置描述每个像素至少必须执行多少片段着色器实例。该值是样本数的一个因子 (0.0-1.0)。因此,如果您选择因子 1.0,您将获得 super 采样。

由于 MSAA 仅涉及基于不同图元的额外片段着色实例,因此可以将其视为基于纯几何的 AA。因此,例如基于 alpha 纹理的混叠未解决。这就是为什么一些网站将 glMinSampleShading 选项称为 MSAA 的透明度样本的原因。

我推荐这篇详细描述和插图的 AA 概述以供进一步阅读: https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/

关于opengl - 我可以使用 OpenGL 计算着色器来解析多重采样纹理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695241/

相关文章:

c++ - OpenGL 立方体贴图 : Writing to mipmap

c++ - glGenBuffers 2 名称?

ios - 如何将制服传递给着色器

c++ - opengl:基于着色器的渲染到帧缓冲区,然后是固定管道渲染

swift - SceneKit 在同一几何体上使用两种具有不同纹理坐标的 Material

c++ - 使用 OpenGL 制作另一个对象

c++ - OpenGL 在纹理上使用着色器

OpenGL 2D非矩形区域裁剪

android - 安卓 : Q texture coordinate not having any effect 上的 OpenGL ES 1.1

c++ - 纹理绑定(bind) : OpenGL + OpenCV