RTR——Chapter5 下

锯齿和抗锯齿

  想象现在有一个巨大的黑色三角形,正在白色的背景上缓缓移动。由于屏幕上的网格单元被三角形所覆盖,因此其像素值的强度应该会平滑的下降。但是通常在各种基础渲染器中发生的情况是,一旦网格单元的中心被三角形所覆盖,这个单元的像素颜色就会立即从白色变为黑色。标准的GPU渲染器也不例外,如图5.14最左侧一列所示。

在这里插入图片描述

图5.14 第一行图像展示了三个具有不同抗锯齿级别的三角形、线和点。第二行图像是上面图像放大数倍之后的结果。最左边一列图像在每个像素中仅使用了一个样本,即没有使用抗锯齿技术;中间一列图像在每个像素上使用了4个样本(网格模式);最右边一列图像在每个像素上使用了8个样本( 4 × 4 4 \times 4 4×4棋盘格模式,采样了正方形区域中的一半)。

  三角形会以像素的形式显示出来,一个网格像素要么被覆盖,要么不被覆盖,绘制出来的线也有类似的问题。由于这个原因,因此三角形和线段的边界会呈现出锯齿状,这个视觉瑕疵被称作为“锯齿(the jaggies)”,当物体运动起来的时候就会变成“爬虫(the crawlies)”。更正式地说,这个问题被称作为“走样(aliasing)”,避免这个问题地技术被称作“反走样(antialiasing)”。(图像领域的走样和反走样,我们会统一翻译为锯齿和抗锯齿)

  采样理论(sampling theory)和数字滤波(digital filtering)的话题内容非常巨大,大到已经足够来写另一本书了。由于这是渲染中的一个关键领域,因此下面将会介绍有关采样和滤波的基本理论。然后会关注当前在实时渲染中能够做些什么来缓解锯齿现象。

采样和滤波理论

  渲染图像的过程本质上是一个采样任务。这是因为图像的生成实际上就是对三维场景进行采样的过程,从而获得图像(离散像素数组)中每个像素的颜色值。为了能够使用纹理映射技术,纹素(texel,texture pixel的缩写,和像素的概念类似,是纹理中的基本单元)也必须进行重新采样,从而在不同的条件下都获得良好的效果。为了在动画中生成一系列图像,通常会以一定的时间间隔来进行采样。本小节将会介绍有关采样(sample)、重建(reconstruction)和过滤(filter)的内容。为了简单起见,大部分资料都会以一维形式呈现,这些概念可以很自然的扩展到二维图像上,用于对二维图像进行处理。

  图5.15展示了一段连续信号如何以均匀间隔进行采样的过程,这个过程也被叫做离散化(discretized)。采样过程的目标是使用数字方式来表示信息,但是这样做会减少信息量,因此还需要对采样后的信号进行重建,这个重建的过程是通过对采样信号进行滤波实现的。

在这里插入图片描述

图5.15 对一个连续信号(左图)进行采样(中图),然后通过重建方法来将其恢复成原始信号(右图)。

  每当进行采样的时候,都可能会发生走样现象,这是不希望出现的瑕疵,因此需要努力对抗走样,从而生成令人愉悦的图像。在老西部片中有一个经典的走样案例,就是使用电影摄像机来拍摄旋转的马车轮子。由于车轮辐条的旋转速度要比相机记录图像的速度快得多,因此车轮可能会看起来旋转得很慢(向前旋转或者向后旋转),甚至可能会看起来根本没有发生旋转,如图5.16所示。之所以会出现这种现象,是因为车轮图像是在一系列时间步长内进行拍摄的,这种现象被称作时域走样(temporal aliasing)。

在这里插入图片描述

图5.16 第一行展示了一个旋转的车轮(原始信号)。第二行对信号进行了采样,但是采样并不充分,使得车轮看起来向着相反的方向旋转,这是由于采样率(sample rate)过低而导致走样的一个例子。第三行的采样率正好是每旋转一周采样两次,因此我们无法确定车轮的旋转方向,这就是Nyquist极限。在第四行中,采样率大于第三行的采样率,我们可以看到车轮向着正确的方向旋转。

  计算机图形学中常见的走样例子,是光栅化线段或者三角形边界上出现“锯齿(jaggies)”;以及当一个具有格子图案的纹理被缩小显示时,会出现被称为“萤火虫(firefly)”的高亮闪烁(摩尔纹)。

  当一个信号的采样率过低时,就会出现走样现象(在光栅化游戏中,屏幕的分辨率大体决定了采样率,因此屏幕分辨率越高,走样和锯齿现象就越少)。此时采样信号的频率会比原始信号低,如图5.17所示。为了对一个信号进行正确的采样(即可以从采样出来的样本中,重建原始信号),采样率必须要在采样信号最大频率的两倍以上。这通常被称作采样定理(sampling theorem),对应的采样率叫做Nyquist率或者Nyquist极限,它由瑞典科学家Harry Nyquist (1889–1976)在1928发现的。图5.16中同样展示了Nyquist极限的例子。事实上,该定理使用了术语“最大频率”,这意味着原始信号必须是有限频宽(band-limited)的,即没有任何频率会超过这个“最大频率”上限。换而言之,相对于相邻样本之间的间距,信号必须要足够平滑。

在这里插入图片描述

图5.17 图中的蓝色实线代表了原始信号,红点代表了均匀间隔的采样点,绿色虚线代表了重建后的信号。第一行展示了采样率过低时的情况,重建后的信号看起来频率较低,即原始信号出现了走样。第二行的采样率是原始信号频率的两倍,重建后的信号是一条水平线。这可以证明,如果采样率稍微增加一点点,可能就可以对原始信号进行完美重建。

  当使用点样本(像素点渲染)对三维场景进行采样的时候,正常情况下是不会有频宽限制的,这是因为三角形的边界,阴影的边界以及其他会产生不连续信号的现象,会导致三维场景中的频率是没有上限的。此外,无论采样样本排列的有多么紧密,场景中的物体都可以被继续缩小,使得它们根本无法被采样。因此,在使用点样本来渲染场景的时候,是无法完全避免走样现象的,而且通常都会使用点采样进行采样。但是有时候,也可以知道一个信号是有限频宽的,其中一个例子就是在将纹理应用到曲面上的时候。因为此时知道了像素的采样率,同时也可以计算出纹理采样的频率,如果这二者之比小于Nyquist极限的话,那么就不需要采取什么特殊手段,直接就可以进行正确的纹理采样;但是如果这个比例太高的话,就需要利用各种算法,来对纹理采样进行频宽限制。

重建

  给定一个有限频宽的采样信号后,现在我们将讨论如何从采样信号中重建原始信号。为了实现这个目的,我们必须使用一个滤波器,图5.18展示了三种常见的滤波器。这里需要注意的是,滤波函数的积分面积应当始终为1,否则重建后的信号就会被放大或者缩小。

在这里插入图片描述

图5.18 左上角为box滤波器,右上角是tent滤波器,下方是sinc滤波器(即 sin ⁡ x / x \frac{}{}\sin x/x sinx/x)。

  在图5.19中,使用了box滤波器(box意味盒子或者方框,这里就不对形状进行翻译了)来对一个采样信号进行重建。这是一种最糟糕的滤波器,因为它重建出来的信号是一段不连续的阶梯状。尽管如此,由于box滤波器非常简单,因此在计算机图形学中也被经常使用。如图5.19所示,将box滤波器放置在每个采样点上,然后对其进行缩放,使得滤波器的顶端和采样点重合(因为box滤波器最大值为1),所有这些缩放和平移过后的box函数之和,就是右图中重建出的信号。

在这里插入图片描述

图5.19 使用box滤波器对采样信号(左)进行重建。这是通过将box滤波器放置在每个采样点上得到的,并在y轴方向上对其进行缩放,使得滤波器的高度与采样点相一致。对这些变换后的box函数求和,即可获得重建后的信号(右)。

  box滤波器也可以使用其他任意的滤波器来进行替换,在图5.20中,使用了tent滤波器(tent意为帐篷,tent滤波器也叫做三角滤波器或者帐篷滤波器)来对采样信号进行重建。请注意,由于tent滤波器实现了相邻采样点之间的线性插值,因此它比box滤波器更好,因为重建之后的信号是连续的。

在这里插入图片描述

图5.20 使用tent滤波器来对采样信号(左)进行重建。右图展示了重建后的连续信号。

  但是,tent滤波器仍然有不足的地方,即重建后信号的平滑性较差,信号会在采样点的位置处发生突变。这与tent滤波器并不是一个完美的重建滤波器有关,为了获得较为完美的重建信号,必须使用一个理想的低通滤波器(low-pass filter)。将一个信号进行分解,最终可以表示为若干正弦波( sin ⁡ ( 2 π f ) \sin (2\pi f) sin(2πf))的组合,其中 f f f是该分量的频率。低通滤波器有一个特点,它会移除所有高于某个特定频率的分量,这个特定频率是由低通滤波器本身所决定的。从直观上来看,低通滤波器消除了信号的尖锐特征,即滤波器对信号进行了模糊处理。sinc滤波器是一个理想的低通滤波器(如图5.18底部所示),其数学表达式为:

sinc ⁡ ( x ) = sin ⁡ ( π x ) π x (5.22) \operatorname{sinc}(x)=\frac{\sin (\pi x)}{\pi x} \tag{5.22} sinc(x)=πxsin(πx)(5.22)

  傅里叶分析理论解释了为什么sinc滤波器是一个理想的低通滤波器。简单来说,原因如下:理想的低通滤波器是频域(frequency domain)中的box滤波器,当它与信号相乘的时候,会移除所有超出滤波器宽度的频率。将这个box滤波器从频域转换到空间域(spatial domain),便可以得到一个sinc滤波器。同时频域中的乘法运算也会被转换为卷积(convolution)运算,这是在本小节中一直在使用的概念,只是并没有实际描述卷积这个术语。

在这里插入图片描述

图5.21 这里使用了sinc滤波器来重建采样信号,sinc滤波器是一个理想的低通滤波器。

  使用sinc滤波器进行信号重建,可以获得更加平滑的结果,如图5.21所示。采样过程会在信号中引入高频分量(在函数图像中则体现为突变点),低通滤波器的任务就是移除这些高频分量。事实上,sinc滤波器消除了所有频率高于采样率 1 / 2 1/2 1/2的正弦波。当采样率为1的时候(即采样信号的最大频率必须小于 1 / 2 1/2 1/2),方程5.22所描述的sinc滤波器便是一个完美的重建滤波器。更加一般的描述是,假设采样率为 f s / 2 f_s /2 fs/2(即意味着相邻样本之间的间距为 1 / f s 1 / f_s 1/fs),对于这种情况,完美的重建滤波器就是sinc ( f s x ) (f_s x) (fsx),它会消除所有高于 f s / 2 f_s /2 fs/2的频率,这对于信号的重采样十分有用(下一小节的内容)。但是由于sinc滤波器的宽度是无限的,而且在某些区域为负,因此在实际中很少会进行使用。

  在低质量的box滤波器,tent滤波器和不实用的sinc滤波器之间,还有一个可用的中间区域,最广泛使用的滤波函数介于这两个极端之间,所有这些滤波函数都与sinc函数有一些类似,但是不同的是,这些滤波函数所能够影响的像素数量是有限的。与sinc函数类似,这些滤波函数在其部分区域上为负,但是对于应用程序而言,负值滤波器通常是不可取且不实用的,因此一般会使用非负波瓣的滤波器(它们通常称为高斯滤波器,因为这些滤波函数要么来自于高斯曲线,要么类似于高斯曲线)。

  在使用任意符合要求的滤波器之后,便可以得到一个连续的信号;然而,在计算机图形学中,并不能直接显示这样的连续信号,因为最终显示在屏幕上的都是离散的点。但是可以使用这些重建后的连续信号,即对连续信号进行重采样,将其离散化,即放大或者缩小信号。将在下一小节中讨论这个话题。

重采样

  重采样(resampling)用于放大或者缩小采样信号。假设原始的采样点位于整数坐标上(0,1,2……),即样本之间具有相同的单位间隔。此外,假设在重采样之后,希望新的样本点能够以 a a a为间隔均匀分布。当 a > 1 a > 1 a>1时,则缩小(minification)了采样信号(降采样,dowmsampling),即增大采样间隔,使用了更少的采样点;当 a < 1 a < 1 a<1时,则放大(magnification)了采样信号(上采样,upsampling),即减小采样间隔,使用了更多的采样点。

  信号放大(上采样)是这两种情况中较为简单的一种,因此先从它开始讨论。假设采样信号按照上一小节的方式进行重建,从直观上来看,现在的信号已经被完美重建,并且是平滑连续的。现在所要做的就是,以期望的间隔对重建后的信号进行重新采样,这个过程如图5.22所示。

在这里插入图片描述

图5.22 左图展示的是采样信号(红点)以及重建后的连续信号(绿色曲线)。右图中,重建后的信号会以两倍的采样率进行重采样,即进行了放大(上采样)。

  但是当发生信号缩小(下采样)的时候,这种技术就不起作用了,因为原始信号的采样率过高,直接降低采样率导致无法避免走样。相反,应当使用一个 s i n c ( x / a ) sinc(x/a) sinc(x/a)滤波器,来从被采样的信号中创建一个连续信号,然后再按照所需的间隔进行重采样,这个过程如图5.23所示。换而言之,通过在这里使用 s i n c ( x / a ) sinc(x/a) sinc(x/a)来作为滤波器,降低了低通滤波器的采样率,从而去除了更多的高频信号。如图5.23所示,滤波器的重采样率降低为原始采样率的一半。将这个方法与数字图像联系起来,类似于先对图像进行模糊(去除高频内容),然后再以一个较低的分辨率对图像重新采样。

在这里插入图片描述

图5.23 左图展示的是采样信号(红点)以及重建后的连续信号(绿色曲线)。右图中的采样率减半,sinc滤波器被水平缩放为原来的两倍。

基于屏幕的抗锯齿

  三角形的边缘如果没有被很好地采样和过滤,就会产生明显的视觉瑕疵。同理,阴影边界、镜面高光以及其他颜色剧烈变化的现象,也会导致类似的问题。本小节所讨论的算法有助于提高这些情况下的渲染质量,这些算法有一个共同点,它们都是基于屏幕的(screen based),即这些算法只会对渲染管线输出的样本进行操作处理。有一点需要注意,不存在最好的抗锯齿算法,每种算法在质量,捕捉尖锐细节(或者其他现象),处理运动物体,内存开销,GPU开销以及速度等方面,都具有不同的优势。

  在图5.14的黑色三角形例子中,存在的一个问题就是较低的采样率,即只在每个像素网格单元的中心,采样了一个单独的样本,因此只能了解到这个像素的中心是否被三角形所覆盖。可以在每个屏幕像素网格中使用更多的样本,并以某种方式将这些样本的结果混合起来,这样可以计算出更好的像素颜色。这个过程如图5.24所示。

在这里插入图片描述

图5.24 左图中渲染了一个红色的三角形,在像素的中心有一个样本。虽然这个像素的很大一部分都被三角形所覆盖,但是由于这个三角形并没有覆盖到像素中心的样本,因此像素最终的颜色值是还是白色的。右图中,每个像素内有四个采样点,其中有两个被三角形所覆盖,在对样本进行混合之后,最终输出了一个粉色的像素值。

  基于屏幕的抗锯齿算法,其通用策略是使用一个针对屏幕的采样模式(即多个采样点),然后对这些样本进行加权求和,最终生成像素的颜色 p \mathbf{p} p,其数学表达如下所示:

p ( x , y ) = ∑ i = 1 n w i c ( i , x , y ) (5.23) \mathbf{p}(x, y)=\sum_{i=1}^{n} w_{i} \mathbf{c}(i, x, y) \tag{5.23} p(x,y)=i=1nwic(i,x,y)(5.23)

  其中 n n n是一个像素内的样本数量; c ( i , x , y ) \mathbf{c}(i, x, y) c(i,x,y)是一个采样颜色; w i w_{i} wi是一个权重,代表了该样本对像素整体颜色的贡献值,范围是 [ 0 , 1 ] [0,1] [0,1]。样本点的位置可以通过该样本在样本序列 1 , … … , n 1,……,n 1,……,n中的序号获得,也可以使用整数标注的亚像素位置 ( x , y ) (x,y) (x,y)来进行表示。换句话说,对于每个像素网格单元而言,其采样点的位置都是不同的,采样的模式也可以因像素而异。实时渲染系统(以及其他大部分的渲染系统)中的样本通常都是点样本,因此函数 c \mathbf{c} c可以看作是两个函数的组合:首先是用一个函数 f ( i , n ) \mathbf{f}(i,n) f(i,n)用于检索屏幕上需要采样的位置 ( x f , y f ) (x_f,y_f) (xf,yf);然后再对屏幕上的这个位置进行采样,即精确检索这个样本点所对应的颜色值。为了计算在特定亚像素位置上的样本,需要事先选择采样方案,并对渲染管线进行配置,这通常是在逐帧(或者是逐程序)进行设置的。

  抗锯齿过程中的另一个变量是代表每个样本权重的 w i w_{i} wi,这些权重的和应当为1。实时渲染系统中所使用的大部分抗锯齿方法,都会给每个样本赋予相同的权重,即 w i = 1 n w_{i} = \frac{1}{n} wi=n1。图形硬件的默认模式是只对像素中心进行一次采样,这是上面抗锯齿方程中最简单的情况。在这种情况下,只有一个样本,该样本对应的权重为1,采样函数 f \mathbf{f} f总是会返回被采样像素的中心位置。

  对每个像素计算多个完整样本的抗锯齿方法被称为“超采样(supersampling)”方法。在概念上最简单的超采样方法是全屏抗锯齿(full-scene antialiasing,FSAA),通常也被称为超采样抗锯齿(supersampling antialiasing ,SSAA)。这个方法会以更高的屏幕分辨率来渲染整个场景,然后再通过对相邻像素样本进行滤波(卷积),从而生成一个图像。例如:假设现在需要一张分辨率为 1280 × 1024 1280 \times 1024 1280×1024的图像,使用该方法时,首先需要离屏渲染一张分辨率为 2560 × 2048 2560 \times 2048 2560×2048的图像,然后将屏幕上每 2 × 2 2 \times 2 2×2像素区域内的颜色值进行平均,然后再显示到屏幕上;对于最终生成的图像而言,每个像素都对应了四个采样点,并使用一个box滤波器进行过滤。请注意,这个过程对应了图5.25中的 2 × 2 2 \times 2 2×2网格采样。这个方法的开销很大,因为每个子样本都有一个z-buffer深度,它们都需要进行完整的着色和填充,FSAA最大的优点就是实现起来很简单。该方法还有一个低质量的版本,即只在一个屏幕轴向上,以两倍的采样率进行采样,也被称为 1 × 2 1 \times 2 1×2超采样或者 2 × 1 2 \times 1 2×1超采样,但是通常为了简单起见,都会使用2的幂次分辨率和box滤波器。NVIDIA的动态超分辨率(dynamic super resolution)功能是一种更加精细的超采样方法,该方法会以更高的分辨率来渲染场景,并使用包含13个样本的高斯滤波器来生成最终的显示图像。

在这里插入图片描述

图5.25 一些采样方案的对比,按照每个像素采样次数从少到多进行排列。其中Quincunx方法包含五个采样点,其中四个和其他像素共享拐角,中心采样点贡献了最终颜色的一半权重。 2 × 2 2 \times 2 2×2RGSS可以比 2 × 2 2 \times 2 2×2grid在接近水平的边缘处,捕获更多的灰度等级。同样的,虽然8 rooks方法使用的样本数量更少,但是它可以比 4 × 4 4 \times 4 4×4grid捕获更多的灰度等级。

  一种与超采样相关的采样方法利用了累积缓冲区(accumulation buffer)的思想,这种方法并不会使用一个巨大的离屏缓冲区,而是使用了一个与所需图像相同分辨率的缓冲区,不同之处在于,这个缓冲区的每个通道中包含了更多的颜色比特。为了对场景进行 2 × 2 2 \times 2 2×2的采样,该方法每帧会生成四张图像,每张图像都是让视图在 x , y x,y x,y方向上分别移动了半个像素距离生成的,这样四张图像便分别对应了像素网格中不同的采样点。这个方法需要每帧预渲染四张图像,并将最终处理好的图像再复制到屏幕上,这些巨大的额外成本使得该方法难以应用于实时渲染系统中。如果不考虑性能的话,这种方法可以用于生成高质量的图像,因为具体累计多少张图像是没有限制的,每个像素中都可以使用任意数量的样本,这些样本也可以位于亚像素的任意位置。在过去,累积缓冲区是一个单独的硬件模块,被OpenGL API直接支持,但是在OpenGL 3.0中被弃用了。在现代的GPU中,可以通过在输出缓冲区中使用更高精度的颜色格式,从而在像素着色器中实现这个累积缓冲区的概念。

  当物体边缘,镜面高光以及尖锐阴影等现象导致颜色发生突变的时候,就需要使用额外的样本来进行处理。通常会对这些情况进行一些额外处理来避免锯齿,例如:让阴影变得更加柔和,让高光变得更加光滑从而避免锯齿;一些特殊的物体类型(例如电线)可以通过增加尺寸,从而保证它们在沿着其长度的方向上的每个位置,都至少占据一个像素。物体边缘的锯齿仍然是一个主要的采样问题,可以采用一些分析方法,在渲染的过程中对物体的边缘进行检测并考虑它带来的影响,但是与直接增加采样点相比,这些检测方法的开销会更大,健壮性也更差。但是,GPU一些新特性打开了抗锯齿的新思路,例如保守光栅化(conservative rasterization)和光栅器有序视图(rasterizer order view)。

  诸如超采样和累积缓冲区等技术,它们生成的新样本与普通像素一样,都会独立完整地进行着色计算并维护深度信息。由于每个样本都需要通过像素着色器,因此这样做的总体收益相对较低,成本相对较高。

  多重采样抗锯齿(Multisampling antialiasing,MSAA)通过只进行一次逐像素的表面着色计算,并在多个样本之间共享结果,从而大大降低了计算成本。假设每个屏幕像素的每个片元(fragment)上有四个 ( x , y ) (x,y) (x,y)子样本位置,每个样本都具有独立的颜色信息和深度信息(z-depth),但是对于该像素的每个片元,像素着色器只会进行一次计算。如果所有的样本位置都被这个片元所覆盖,那么则在像素的中心位置来计算这个着色样本;而如果这个片元只覆盖了部分样本,那么着色样本的选择可以进行移动,从而更好地表示所覆盖的位置。这样做有一些好处,例如可以避免对纹理边缘的着色采样。这个位置调整被叫做质心采样(centroid sampling)或者质心插值(centroid interpolation),如果MSAA的功能被启用的话,那么GPU会自动对样本的位置进行调整。质心采样避免了非三角形的问题,但是可能会导致梯度计算返回不正确的结果。如图5.26所示。

在这里插入图片描述

图5.26 中间的图展示了一个像素被两个物体重叠的情况,其中红色物体覆盖了三个样本,蓝色物体覆盖了一个样本。图中的绿色点代表了像素着色器计算的位置,由于红色三角形覆盖了像素的中心,因此这个位置被用于着色器计算;而蓝色物体的像素着色器将在1号样本的位置上进行计算。对于MSAA而言,所有的四个样本位置都存储了单独的颜色信息和深度信息,右图展示了EQAA的2f4x模式,四个样本对应了四个ID值,这个ID值用于在另一个只包含颜色信息和深度信息的表格中进行检索。

  MSAA的速度要比纯超采样的方案快,因为每个片元只会进行一次着色计算,它专注于以更高的速率来对片元覆盖的像素范围进行采样,并共享计算出的着色结果。通过对采样和覆盖的进一步解耦,从而可以节省更多的内存,这反过来也可以使得对抗锯齿进行加速——对内存的访问越少,渲染的速度就越快。NVIDIA在2006年引入了覆盖采样抗锯齿(coverage sampling antialiasing ,CSAA),AMD随后也提出了增强质量抗锯齿(enhanced quality antialiasing ,EQAA)。这些技术以更高的采样率,同时只存储片元所覆盖的范围来进行实现,例如:EQAA的“2f4x”模式只存储了两组颜色和深度信息,这些信息会在四个样本位置之间进行共享。并且这些信息也不再和具体的样本位置相绑定,而是存储在一张额外的表格中,四个样本仅需要各自使用一个bit,来指定哪组颜色深度信息与该位置相关联即可,如图5.26所示。片元所覆盖的样本数量最终决定了该片元对像素颜色的贡献权重。如果此时存储的颜色数量超出了存储上限(两组),那么就会丢弃一个已存储的颜色信息,并将其所关联的样本标记为未知,这些被标记为未知的样本最终不会对像素颜色产生贡献。对于大多数场景而言,一个像素同时被三个不透明的片元所覆盖,并且这些片元还是以完全不同的方式进行着色的,这种情况发生的概率非常低,因此这个方案在实际应用中表现良好。虽然EQAA有着一定的性能优势,但是为了获得最高质量的画面效果,《极限竞速:地平线2(Forza Horizon 2)》还是采用了 4 × 4 \times 4×MSAA 。

  当场景中所有的几何体都被渲染到一个多样本缓冲区(multiple-sample buffer)之后,会进行一个解析(resolve)操作。在这个过程中,会对样本的颜色进行平均化,并最终决定像素的颜色。值得注意的是,当使用高动态范围颜色值(HDR)的时候,使用多重采样可能会导致一些问题,一般在这种情况下,为了避免出现视觉瑕疵,都会在解析之前对颜色值进行色调映射。色调映射的开销可能会很大,因此可以使用一个更简单的色调映射近似函数或者其他方法。

  在默认情况下,MSAA会使用box滤波器进行解析。ATI于2007年引入了自定义滤波器抗锯齿(custom filter antialiasing ,CFAA)技术,该项技术允许使用一个更宽或者更窄的tent(帐篷形)滤波器来进行解析,从而可以稍微扩展到周围的像素单元格上。EQAA后续也支持了这种滤波器,CFAA因此被取代了。在现代的GPU上,像素着色器或者计算着色器可以访问MSAA的样本,并使用任何所需要的滤波器来进行重建,甚至可以访问周围像素的样本。一个范围更大的滤波器可以减少锯齿和走样,但是它也会失去尖锐的细节。Pettineo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值