屏幕空间抗锯齿

屏幕空间抗锯齿

由于我们光栅化的特性,三维世界的物体总会以二维的形式展示。我们的屏幕是由一颗颗方形像素点组成的,因此我们无法获得真正完美平滑的对象。我们只能够尽最大努力去处理像素点的采样,使其能够在视觉上有很好的光滑效果。光栅化是在屏幕空间完成的,因此我们抗锯齿的算法也基本都是在屏幕空间实现的,所以也叫基于屏幕的抗锯齿(Screen-Based Antialiasing)。

最原始的像素采样就是在像素的中点去采样,判断是否落入三角形内。如下图:

我们发现,三角形已经有大部分落入像素,但是未覆盖中心点就判断该像素未落入三角形内,这会产生非常大的偏差。包括线段和点这些图元,都会产生非常严重的锯齿,如下效果:

抗锯齿有非常多种法,但没有一种方法是真正完美的,不同的方法在移动时的外观,内存成本,GPU要求和速度方面都具有不同的优势。产生上图效果的一个重要原因就是采样率低。我们如果在单像素内利用更多的样本对场景进行采样,并以某种方式混合它们,则可以计算出更好的像素颜色。如下图:

我们并不用三角形的颜色直接填充像素,而是利用多个采样点,根据采样点的权重计算最后的颜色。采样公式为:

其中,n是为像素采集的样本总数。函数c(i,x,y)是样本颜色,而wi是在[0,1]范围内的权重,总和为1。但我们都会给每个权重赋予值1/n。每个样本将对整个像素颜色有所贡献。这里要注意的是x,y是像素左下角坐标(因为坐标取整),而我们函数c(i,x,y)可以根据第i个样本,从新获取一个采样位置。如n为,则有4 个新的采样点,如上图。因此我们的函数c不同,我们可以根据需求不同,获取不同的采样位置。一些动画软件可能每帧的采样点位置都是不同的。我们发现最基本的采样方式是上述方法的一个特殊形式,其中n=1,函数c(i,x,y)的采样位置始终在像素中心位置。我们这里举的抗锯齿例子叫作多重采样抗锯齿(MSAA),我们会在下文给出更详细的介绍。

我们接下来看一下常见的抗锯齿方法。

 

超采样抗锯齿(SSAA)

在一个像素内计算一个以上完整样本的抗锯齿算法都被称为超采样抗锯齿(SSAA)也称为全场景抗锯齿(FSAA)。什么是计算完整样本的抗锯齿算法呢?如果需要1280×1024的图像,区别于上面提到的MSAA。SSAA会在屏幕外渲染2560×2048的图像,然后对屏幕上每个2×2像素区域求平均。这表明我们计算每个像素时,都要计算4个像素。渲染方式如下图:

我们可以发现,该方法就是将一个像素分成新的4个子像素,每个像素里依旧是一个样本。而MSAA是每个像素内有多个样本,这就是二者的区别。SSAA这种方法的成本很高,因为所有子样本都必须完全着色并填充,表明每个子样本都要通过片元着色器,且每个样本具有z缓冲区深度。 其主要优势是简单。此方法的其他较低质量版本仅在一个屏幕轴上以两倍的速率采样,因此称为1×2或2×1超级采样。

有一种特殊的采样方法是基于SSAA的。我们称它为累积缓冲区。代替一个大的屏幕外缓冲区,此方法使用的缓冲区具有与所需图像相同的分辨率,但每个通道具有更多的颜色位。为了获得2×2的场景采样,将生成四个图像,并根据需要将视图在屏幕的x或y方向上移动半个像素。生成的每个图像均基于网格单元内的不同样本位置。每帧必须重新渲染场景几次并将结果复制到屏幕的额外费用使该算法在实时渲染系统中成本很高。当性能不是很关键时,它对于生成更高质量的图像很有用,因为每个像素可以使用任意位置的任意数量的样本。

 

多重采样抗锯齿(MSAA)

多重采样抗锯齿(MSAA)的每个像素只计算一次片元着色并在样本之间共享该结果,从而降低了高计算成本。每个像素可能有四个(x,y)采样位置,每个都有自己的颜色和z深度,但优点是对于每个像素片段,像素着色器只计算一次。如果片段覆盖了所有MSAA位置样本,则在像素中心计算着色样本。相反,如果片段包含较少的位置样本,则可以移动着色样本的位置以更好地表示所覆盖的位置。例如,这样做可以避免从纹理的边缘进行着色采样。此位置调整称为质心采样或质心插值,如果启用,则由GPU自动完成。MSAA如下图:

MSAA比SSAA快,因为该片段仅被着色一次。它着重于以更高的速率采样片段的像素覆盖率并共享计算出的着色属性。通过进一步分离采样和覆盖范围,可以节省更多的内存,这反过来又可以使抗锯齿更快———触及的内存越少,渲染越快。 NVIDIA在2006年推出了覆盖采样抗锯齿(CSAA),AMD随之推出了增强质量的抗锯齿(EQAA)。这些技术通过索引来节省空间。例如,EQAA的“ 2f4x”模式存储两个颜色和深度值,在四个样本位置之间共享。颜色和深度不再存储在特定位置,而是存储在表格中。然后,四个样本中的每个样本仅需要一位来指定两个存储值中的哪一个与其位置相关联。如下图:

 

旋转栅格超级采样(RGSS)

Naiman表明,在近水平和近垂直边缘上的混叠(锯齿)对我们的影响最大。其次是斜率接近45度的边缘。旋转栅格超级采样(RGSS)使用旋转正方形图案来在像素内提供更多垂直和水平分辨率。下图显示了此模式的示例:

RGSS模式是一种拉丁超立方或N-rooks采样的形式,其中n个采样放置在n×n网格中,每行和每列一个采样。使用RGSS,四个样本分别位于4×4子像素网格的单独行和列中。与常规2×2超采样模式相比,此类模式特别适合捕获几乎水平和垂直的边缘,在常规2×2超采样模式下,此类边缘可能会覆盖偶数个样本,因此有效水平较低。

N-rooks采样会有所不足,其特点是每行每列只能有一个采样点。例如,这些样本都可能沿着子像素网格的对角线放置,因此对于几乎平行于该对角线的边缘给出较差的结果。示例图如下:

为了获得更好的采样(上图右),我们要避免将两个采样放在一起。我们还希望分布均匀,将样本均匀分布在整个区域。为了形成这样的模式,分层采样技术(例如拉丁超立方体采样)与其他方法(例如抖动,霍尔顿序列和泊松磁盘采样)相结合可以达到这种效果。

 

 Quincunx多重采样抗锯齿

NVIDIA的较早的Quincunx方法是一种可以使样本影响多个像素的实时抗锯齿方法,该方法是GPU支持的算法。“Quincunx”是指五个对象的排列,四个在正方形中,第五个在中心, Quincunx多重采样抗锯齿使用此模式,将四个外部采样放在像素的角上。模式如下图:

可以看到每个角样本值被分配到其四个相邻像素。并非像其他大多数实时方案那样平均地对每个样本加权,中心样本的权重为1/2,每个角样本的权重为1/8。由于这种共享,每个像素平均只需要两个样本,其结果比两个样本的FSAA好很多。

Quincunx通过在像素边界共享样本而具有仅两个样本的低成本。 RGSS模式更适合捕获接近水平和垂直边缘的更多灰度。 FLIPQUAD模式最初是为移动图形开发的,结合了这两个理想的功能。它的优点是成本仅为每个像素两个样本,并且质量类似于RGSS(每个像素四个样本)。此采样模式如下图所示:

 

形态学方法(Morphological Methods)

混叠(锯齿)通常是由边缘引起的,例如由几何形状,尖锐阴影或明亮高光(萤火虫效应)形成的边缘。2009年,Reshetov沿着这些思路提出了一种算法,称其为形态抗锯齿(MLAA)。 “形态”是指“与结构或形状有关”。Reshetov的论文强调搜索和重建边缘。

这种抗锯齿形式是在后期处理中执行的。也就是说,以通常的方式完成渲染,然后将渲染完成的图像进行抗锯齿。自2009年以来,已经开发出了各种各样的技术。那些依赖于其他缓冲区(例如深度和法线)的技术可以提供更好的结果,如亚像素重建抗锯齿(SRAA)。随后还出现仅适用于几何边缘的抗锯齿,如几何缓冲区抗锯齿(GBAA)和距离边缘抗锯齿(DEAA),这些方法使渲染器还可以计算三角形边缘到像素中心的距离。

最通用的方案只需要颜色缓冲区,这意味着它们还可以改善阴影,高光或以前应用的各种后处理技术(如轮廓边缘渲染)中的边缘。例如,定向局部抗锯齿(DLAA)的处理方式:接近垂直的边缘应水平模糊,接近水平的边缘也应与其邻居垂直模糊。

边缘检测的更复杂形式试图找到可能以任何角度包含边缘的像素并确定其覆盖范围。检查潜在边缘周围的邻域,目标是尽可能重建原始边缘所在的位置。然后可以使用边缘对像素的效果来融合相邻像素的颜色。有关过程的概念如下图:

左侧是锯齿图像。目标是确定形成边缘的边缘的可能方向。在中间,该算法通过检查邻居来记录边缘的可能性。给定样本,显示了两个可能的边缘位置。在右侧,最佳估计边缘用于将邻近的颜色与估计的覆盖率成比例地混合到中心像素中。对图像中的每个像素重复此过程。该方法便是比较常用的MLAA。

但该方法也会有明显的缺点:如果两个对象之间的色差低于算法的阈值,则可能无法检测到边缘。难以解释具有三个或更多不同表面重叠的像素。颜色在像素之间快速变化的具有高对比度或高频元素的表面会导致算法遗漏边缘。使用形态抗锯齿时,文本质量也通常会受到影响。当渲染宽度或宽度小于像素的对象(例如电线或绳索)时,形态抗锯齿基于图像的特性将会完全忽略掉这些小的对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值