本文基于Jorge Jimenez,Jose Echevarria,Thiago Sauce和Diego Gutierrez的杂志。
他们的SMAA演示实现可以在
这里找到(.exe文件)。 在我的GTX 960 2GB上工作正常。
旧的抗锯齿方法
多年来,平滑的标准是MSAA(多重采样抗锯齿)和SSAA(超采样抗锯齿)。 实际上,它们仍然在所有
现代抗锯齿技术中提供最高质量。 众所周知,在空间(虚线)和时间水平(闪烁)(通常在具有高/低对比度的图像的边缘和区域附近)都缺少样本,会导致混叠。 为了解决这个问题,我们有两种曾经是唯一的解决方案的方法:超级采样和多重采样。 通过超级采样,我们可以放大图像,然后将其采样降低到所需的分辨率。 该原理非常有效,因为它适用于问题的所有方面。 多重采样使用类似的解决方案。 在这种方法中,每个样本都基于特定系数进行复制。 使用现代高分辨率,这需要功能强大的图形卡。 因此,我们需要在空间和时间层面上都采用新的平滑方法。 所有这些方法在其工作中都使用一种算法-边缘识别。 但是他们执行其他操作。
现代平滑方法
尽管劣于上面列出的两种方法,但有许多现代的基于过滤器的方法可以很好地完成工作。 FXAA,DEAA,GPAA,GBAA,CSAA,EQAA,DLAA ...在本文中,我们将讨论SMAA及其前身MLAA。 这些基于过滤器的现代方法有其自身的问题:
- 这些方法所基于的大多数边缘识别算法仅考虑像素之间的数值差异,而忽略了它们向观看者显示的方式。
- 对象的原始形状并不总是被保留,在文本,尖角和子像素元素上几乎总是清晰可见拐角的一般倒圆角。
- 大多数解决方案旨在仅处理水平或垂直模式,而忽略对角线。
- 实际的子像素元素和子像素运动未正确处理。 锯齿反射(镜面反射)和阴影(阴影)没有完全消除。
您可能会猜到,我们提出了这些问题,因为我们想消除它们。
形态抗锯齿(MLAA)
MLAA正在尝试评估原始几何图形的覆盖范围。 为了对平滑后的三角形进行精确光栅化,有必要计算三角形内每个像素的覆盖区域,以使其与背景正确混合。 MLAA从抗锯齿图像开始,然后通过矢量化轮廓以计算其覆盖区域来逆转该过程。 由于在光栅化之后无法识别背景,因此MLAA将其与邻居混合,并假定其值接近原始背景的值。
换句话说 ,该算法(使用有关颜色或深度的信息)识别边界,然后在边界中找到特定的模式。 通过边界中像素的智能混合来提供平滑。 MLAA在DirectX 10和Mono Game(XNA)上具有实现。 在寓言II之类的游戏中确实实现了该功能。 MLAA的创建者后来创建了SMAA(即
增强的亚像素形态抗锯齿) (高级亚像素形态抗锯齿),这是本文的主题。
MLAA行动增强型亚像素形态抗锯齿(SMAA)
《 孤岛危机2》 中SMAA与其他方法的比较SMAA提供可靠的边缘识别,以及处理尖锐的几何元素和对角线的简单有效的方法。 此外,SMAA不会像许多其他方法一样更改几何形状。
以上-AA号; 在中间-MLAA; 下面-SMAASMAA建立在MLAA流水线之上,并对其进行了改进或重新思考。 特别是,通过使用颜色信息以及调整局部对比度以创建更清晰的边缘,可以改善边缘识别。 该方法扩展了用于保存尖锐的几何元素和对角线的图案数量。 最后,他展示了如何将形态平滑与多采样或超采样以及时间重投影准确地结合在一起。
边缘识别
边缘识别是至关重要的一步,因为无法识别的边缘仍会变形。 另一方面,过多的滤波边缘会降低平滑图像的质量。 各种信息可用于边缘识别:颜色,亮度,深度,表面法线及其组合。 SMAA使用亮度的原因有四个:
- 更少的文物。
- 亮度始终可见。
- 它可以处理阴影变形。
- 最后,它比色度更快。
左和中:其他边缘识别方法,导致出现红色相交和伪像; 在右边:完美锐利的边缘SMAA记住这张图片。 边缘识别的工作方式如下:最终计算出的值是一个布尔值,称为
left edge的
border 。 同样,将计算顶部边缘的布尔值。 配方
c的所有值都称为
对比度增量 。
模式处理
模式识别SMAA使您可以保存锐利的几何元素,例如角度,处理对角线并提供精确的距离搜索。
锋利的几何元素: MLAA中的轮廓矢量化容易产生圆角。 为避免这种情况,SMAA观察到轮廓线边缘的交点最大为一个像素,对于尖角,此长度可能会更长。 因此,SMAA的相交边缘的长度为2个像素,从而减少了较复杂的拐角处理。
对角线图案:我们添加了一种全新的方式来识别对角线图案。 它包括以下两个阶段:
- 对角线距离搜索 和 对角线的左侧和右侧。
- 获取相交的边缘 和 。
- 使用此输入,我们定义特定的对角线图案,以访问区域的预先计算的纹理,从而获得区域 和 。
如果对角线图案的识别失败,则正交线图案的识别开始。
精确搜索距离:识别和分类图案
的关键是获得边缘的精确距离(线两端的长度)。 为了加快此过程,MLAA正在积极使用硬件插值。 双线性硬件过滤可用于在单个内存访问操作中获取和编码多达四个不同的值。 两个二进制值(即
bilinear )的线性内插会创建一个浮点值,由以下公式描述:
哪里
和
是两个二进制值(0或1),并且
是插值。
结果
MLAA每像素处理一个样本。 这导致子采样,因此无法重新创建真实的子像素元素。
比较MLAA和SMAA而没有AA但是,SMAA在亚像素级别上运行。 这导致以下结果:
所有这些都可以在下图中看到,其中将这些方面与其他方法的结果进行了比较。 实际上,SMAA可以产生接近SSAA 16x的结果。
这些解决方案中的每一个产生的开销都是可以忽略的。 特别是,局部对比度的调整仅需0.08毫秒,对尖锐的几何元素和精确距离的识别需要0.01毫秒,对角线的处理需要额外的0.12毫秒。 简而言之,SMAA相当快,比SSAA和MSAA慢,但更富有成果,而且资源占用更少。