而这正是SMAA技术需要做的——改进边缘检测算法。一帧图像中的边缘有很多,但并非每一条都需要处理。据研究,若周围区域里存在一条颜色反差较大的边缘时,人的视觉系统会忽略对比度相对较低的边缘,因此可以把低对比度的部分从处理过程中早早剔除,保留图像的锐度,同时节约了处理时间。
图6:改善对比度适应算法后的处理效果对比。
如图6所示,左起第一张图片中,占据高对比度优势(由浅色Z形线标记)的边缘将对下方的其余边缘(以竖线标记)产生遮盖作用,通常情况下人的注意力将集中在高对比度的边缘上。若是使用MLAA技术,在抗锯齿处理时,不考虑对比度的影响就会带来位居中间的图样,它对不该处理的边缘也做了处理,导致了一串不平滑的颜色改变。而将对比度纳入考量的SMAA技术则会形成右图,此时颜色过渡就更为平滑。
图7:高对比度边缘的计算量对比。
再看图7。以点状标记的是当前的待处理像素,浅色标记的是它的左边缘,可能对这条边缘形成遮蔽作用的其他边缘被进行了加粗,足足有六条之多。若使用MLAA技术,像素的每条边都需要访问这六条边。而使用SMAA技术后,像素总共只需要访问四条边缘,大大降低了访问次数。
同时,在边缘检测中寻找线条延伸终点的步骤也需要频繁的数据访问,这对显存带宽形成了一项挑战。为了提高带宽利用率,在改进版的Jimenez’s MLAA技术中就已利用硬件的双线性插值来加速这个过程。通过一个简单的线性插值编码公式,可以在一次访问中得知两个像素的情况,大大地降低了带宽压力,这一特性被称为精确距离搜索。
图8:双线性插值的搜索模式
如图8所示,颜色加粗的水平线条就是待搜索的边缘。从星形像素出发,到达第一个菱形处,我们就一次性跨越了两个像素,重复这个过程,直到圆圈标示的终点,我们就得到了所要的边缘信息。这里的精髓在于,我们在理论上以两倍速度抵达了目标。而没有引入双线性插值优化的MLAA只能逐像素地访问过去,在这一个步骤上的理论速度只有Jimenez’s MLAA的一半。
图9:Jimenez’MLAA与SMAA的对比
不过虽然图8的方法(如图9左上)能够有效找到水平线条的终点,但是并不完美。它能够告诉我们水平方向上的边缘情况, 但是却会错过垂直线条上的交叉边(图9左下),这是因为Jimenez’s MLAA的双线性插值公式只考虑了一维的情况。SMAA将Jimenez’s MLAA当中的双线性插值公式再度加强,引入了垂直坐标分量(右下),能够在一次访问中获取水平与垂直两个方向上的信息。图9右上图为二者对比,采样点每次只能跳跃到像素垂直边的是Jimenez’s MLAA的跳跃过程,而采样点在像素内中上位置的则为SMAA的跳跃过程。可以看到,SMAA的采样点有所偏移,从像素边缘处移到了像素内部,这样就不必担心错失垂直方向上的信息了。
图10:改进后的精确距离搜索的质量对比。左图为SRAA,中间为SMAA 1x,右图为SMAA 4x,请观察图中白色柱状天线,显然右图结果为平滑。
众所周知,MLAA的一大弱点就是模糊了文字边缘,未能保留文字显示应有的锐利。作为一个在MLAA之上构建的新技术,SMAA要如何解决这个问题呢?答案是:尖锐几何特征检测。
如上文所说,MLAA是依据颜色上的不连续原理来对边缘进行处理,在重新向量化的步骤中, 交叉边在此扮演了重要角色。然而Jimenez等人观察到,MLAA、FXAA技术上采用的交叉边多只有一个像素的长度,但物体上的转角长度往往大于这个值, 因此这些技术无法“知道”哪些是锯齿,哪些是物体自身的转角(见图11)。这就令MLAA、FXAA等技术也会对物体的转角进行重新向量化处理,从而造成物体的转角处出现不应有的模糊效果。SMAA解决这一问题的办法很简单—将交叉边长度扩大至两个像素。
图11:更加精确的重新向量化处理
让我们通过图11来分析这项特性的优势所在。w右侧有着两级阶梯状的锯齿(黑色线圈处),垂直凸起的边长只有一个像素,对此MLAA能够正确地进行重新向量化,一条较长、有斜度的线条横贯八列像素,这就是MLAA恢复出的原始边缘即逼近线。被逼近线条一截为二的那些像素,会根据被截面积的大小计算权重,加以不同的模糊处理,于是锯齿就被平滑了。再看图的左侧,标注了e3的像素上方有一个被正方形线框起的部分,这里有一个90°转角。如果我们根据原始MLAA的处理规则,以一个像素长度的交叉边(加粗的垂直边)来处理,得到的重新向量化结果就是画出另一条斜度很大的逼近线——但是问题出来了。这个90°的转角原本就是物体应有的形状,这里的锐度应该忠实地保留,不需要进行抗锯齿处理。如果我们在这里也画上逼近线,就会将位于90°转角上的这个像素一截为二,由此引入不必要的模糊,不该处理的“锯齿”被处理了,带来了锐度的损失。但如果使用两个像素长度的交叉边,长度扩展至e1处,那么就可以检测到正确的90°转角,画出与水平边重合的逼近线,从而避免出现这个缺陷。
图12:SMAA在文字锐度上轻松击败了MLAA。
从图12中可以看到,SMAA在文字锐度上轻松击败了MLAA。将图像放大可以看到,由于字母“D”内侧出现的交叉边只有一个像素长度,无法改变,被错误地认为是需要处理的边缘,因此也被SMAA施加了模糊化处理,但除非放大图像仔细观察,否则这一改变几乎无法察觉。而交叉边长度明显超过一个像素的字母“E”上锐度则得到了完美保留,没有一丝一毫的抗锯齿处理痕迹。这一关键改进使得SMAA在对付文本时能够尽量保留锐度,从而将MLAA甩在了身后。
图13:MLAA(左)与SMAA(右)对几乎呈45度角的斜线进行重新向量化。由于引入了对角线模式处理,SMAA准确重建了对角线状的边缘。
除了SRAA之外,大部分抗抗锯齿技术检测水平和垂直方向上的边缘,这使得针对斜线的反锯齿结果不尽如人意。SMAA引入了新颖的对角线搜索,搜寻左上—右下,左下—右上两种模式的形状,依旧进行距离搜索,获取交叉边,以此得到相应的覆盖区域。如果发现对角线至少有两个像素长度,那么就进行处理,否则就把它们当成普通边缘。对角线搜索在我们之前提到的水平、垂直边缘搜索之前执行,这保证了对角线将得到优先处理。
图14:左侧为SRAA,右侧为SMAA,显然右图SMAA的处理结果更为平滑、自然。
即便与依靠几何信息( 深度与法线值)做边缘检测,可对对角线进行抗锯齿处理的SRAA相比,SMAA在一些特定场景中的优势也非常明显。如图14所示,路灯上的深度与法线变化很小,SRAA的处理就难以准确表现,而SMAA专门引入了对角线模式的检测,因此只需1x处理,SMAA就轻松将SRAA甩在身后。到了S2x的级别上,SMAA甚至可以与号称黄金标准的SSAA 16x并驾齐驱,对角线检测的引入确实效果卓著。然而SMAA相对于SRAA的优势并不止于此。
图15:子像素特征的渲染,左侧为SRAA,中间为SMAA 1x,右侧为SMAA 4x。
从图15可以看到,SRAA在子像素级别上的重建质量还是可以的,虽然只对颜色值做了1x采样,但是它对其余子像素样本的颜色值估计的确很不错,这在第一排图像中林立的天线与第二排图像中的铁丝网上有所显示,而SMAA 1x的重建质量比较糟糕,不是SRAA的对手,但是SMAA 4x的质量就是毫无疑问的完胜。这个完胜不仅仅在于图像的重建质量,还在于图像的处理时间,就算以4x采样处理,SMAA相对于SRAA也有些许优势。虽然优势不到一毫秒,但是在实时渲染领域,速度实在是至关重要。要知道正是为了抢下几毫秒的时间,索尼旗下的工作室不惜大费周章改进渲染流水线, 拿出了一个SPU+GPU的帧间交替渲染方案, 终才造就了一个低延迟的PS3专属MLAA。SMAA的局部对比度适应处理一般只需0.08毫秒,尖锐几何特征检测和精确距离搜索的时间尚不到0.01毫秒,对角线处理也只需0.12毫秒,速度和质量上的双重优势对开发者而言确实是一个不小的诱惑,目前SMAA已经能够集成进CryEngine 3引擎当中,它是否强大到能够说服更多的游戏开发者使用,唯有等待时间来检验了。
强大的“ 启发式模糊” ,稳定性, 对锐度的保留, 只有MSAA十分之一的处理速度,SMAA的确在MLAA开辟的道路上迈出了更坚实的一步。但是这并不意味着抵达终点。按照学术与工业界的惯例,技术的好坏仍然要等待后续研究与开发应用的进一步反馈和评价,虽然SMAA迅速得到了来自Crytek的支持,但是目前就断言它是后期处理式抗锯齿的终极技术为时尚早。我们仍需谨记一位图形专家的评论:“实时渲染的问题远没有到完满解决的地步。将来会更美好。”