Chapter 5 – Shading Basics 着色基础

5.4 Aliasing与Anti-Aliasing

想象一下,一个巨大的黑色三角形在白色背景上移动。当屏幕上的网格单元被三角形覆盖时,网格单元的像素值应该不断下降。一般来说,当渲染器的网格单元被覆盖时,像素颜色会立刻从白色变为黑色。标准的GPU渲染也没有例外。

三角形需不需要在像素中显示,在我们绘制直线时也会遇到同样的问题。由于这个原因,三角形的边缘看上去是锯齿状的。在图形学中,这一问题被称为aliasing,而为了避免这个问题所做的努力被成为抗锯齿(antialiasing)

关于采样的原理以及数字滤波(digital filtering),光光这两块内容就足以写一本书。作为渲染中的关键部分,我们会阐述采样与滤波的基本原理。之后我们将主要学习如何在实时渲染中缓解锯齿效果。

5.4.1 采样与滤波的原理

绘制图像的过程其实就是一个采样任务。因此,生成一张图像的过程就是从三维场景中为图像中的fragment采样颜色值的过程。为了使用贴图映射(texture mapping,我们将在第六章学习),贴图中的texel需要在不同的情况下被再一次采样。为了生成动画中的一系列图像,动画一般会以统一的时间间隔进行采样。在本小节中,我们将会为大家介绍采样,重构以及滤波。为了便于大家理解,我们使用的例子大多数是“一维的”。这些理论也可以被延伸为“二维”,因此当我们处理二维图像时就能使用这些理论。

下图展示了一个连续的信号是如何以统一的空间间隔进行采样的。而采样的过程是为了以数字的形式表示信息。这样能够减少信息量。但是,被采样的信号需要被重构以恢复到原先的信号,也就是对采样的信号进行滤波。

当我们完成采样时,aliasing(aliasing指的是试听信号中的错误,这里并不是☞锯齿)就有可能会产生。显然,aliasing会让我们的图像看起来不那么好,而我们要做的就是缓解aliasing。而过去西方电影中,在使用电影摄像机来拍摄转动的轮子时就会产生aliasing。由于车轮转动的速度远远快于摄像机记录图像的速度,车轮可能看上去转动的速度较慢(向前或者向后),甚至看上去完全没有在转动。如下图所示。产生这一效果的原因是因为摄像机以一定的时间间隔来拍摄车轮,而这一效果被称为temporary aliasing

上图中,最上面一排圆形组表示旋转的轮子。但在第二行中,我们对其采样的频率过低,导致其看上去是向后转的(逆时针转动)。这一类的aliasing是由过低的采样率造成的。在第三行中,采样率虽然高于第二行,但是仍然不够高,我们无法分辨车轮是顺时针还是逆时针转动。在第四行中,我们又提高了采样率,此时我们可以看清车轮是顺时针转动。在计算机图形中,

常见的aliasing例子就是光栅化线条或者三角形边缘的锯齿,以及当贴图的检测模式为minification时造成的“萤火虫(fireflies)”效果。

当信号以太低的频率进行采样时,aliasing就会发生。之后被采样的信号的频率会低于原始信号。如下图所示。为了正常采样一个信号(能够基于采样来重构原始信号),采样频率需要大于原始信号最大频率的两倍。这通常被称为采样原理(sampling theorem),采样频率则被称为奈奎斯特频率(Nyquist rate)。在上述原理中,我们使用了“最大频率”这一术语,这表示信号是有带宽限制的。也就是说,在相邻的采样之间,信号需要足够平滑。

上图中,蓝色的实线表示原始信号,红色的圆点表示统一间隔的采样点,绿色的虚线则表示重构后的信号。上半部分的曲线,其采样率过低。因此重构后的信号的频率低于原始信号。下半部分的曲线,其采样率是原始信号频率的两倍,而重构的信号是一条水平的线。因此,如果我们稍稍增加采样率,就能够完美地重构原始信号。

当我们使用采样点来绘制三维场景时,一般不会有任何带宽限制。三角形的边缘,阴影的边界,由于其改变并不是连续的,所以其频率是无限的。同样的,无论采样点多么小,物体都有可能无法正好采样。因此,当我们使用采样点来绘制场景时,是无法完全避免锯齿问题的。但有时,我们可以知道什么时候信号到达了带宽的零界点。例如,当我们将贴图应用于物体表面。我们可以计算贴图采样的频率,将其与像素的采样率进行比较。如果这个频率低于奈斯奎特频率,那么我们并不需要做一些特殊的操作来采样贴图。如果频率太高,那么我们可以使用不同的算法来限制贴图。

重构

基于一个带宽限制的采样信号,我们现在需要学习如何以此为基础重构原始信号。为了实现这一目标,我们需要使用滤波(filtering)。下图展示了常用的三个滤波。需要注意的是,滤波的范围应该永远是1,否则重构后的信号会发生错误。

在下图中,我们使用了box filter(选取最近的采样点)来重构采样信号。这也是效果最差的滤波,因为其重构的信号是不连续的,阶梯状的。正如图表所示,box filter范围内所有的值都是采样值。

显然,box filter可以由任何其他filter替代。下图为tent filter,其也被称为triangle filter(三角形滤波)。我们需要注意的是,这一滤波将在相邻的采样点之间进行线性插值,所以其效果好于box filter,且重构后的信号是连续的而不是阶梯型的。

但是使用tent filter重构的信号,其平滑度并不好。每个采样点的斜率变化都非常大。这也意味着tent filter并不是一个完美的重构filter。为了找到最佳的重构方案,我们将使用low-pass filter。信号的频率组件是一个正弦波:sin(2πf),其中f为该组件的频率。low-pass filter将会移除频率高于我们定义的filter频率的组件。而理想状态下的low-pass filter就是sinc filter,如下图所示。

重新采样(Resampling)

resampling被用于放大或者缩小一个采样信号。假设原始的采样信号点的坐标为0,1,2,…,也就是说采样点之间的间隔为1。此外,假设我们希望重新采样后新的采样点之间的间隔为a。如果a>1,那么会发生minification(缩小)。如果a<1,那么会发生magnification(放大)。

magnification更容易理解,所以我们先解释它。假设,我们成功地以采样点来重构信号,而现在需要将重构后的信号重新进行采样,其过程如下图所示。

上图中,左侧部分为采样点与重构后的信号。右侧,重构后的信号以双倍的采样率重新进行采样,这就发生了magnification。

是上述例子并不适用于minification。原始信号的频率太高以至于我们通过采样率无法避免aliasing的问题。相反,我们应该使用一个sinc(x/a)的filter来创建一个连续的信号。之后,在重新基于设定的间隔进行采样。如下图所示。通过使用sinc(x/a)作为filter,low-pass filter的宽度增加了,所以大多数信号的高频率内容被去除。同时,filter的宽度也变为两倍以减少重采样率。而在图形学中,我们也会先blur贴图在将其以较低的分辨率进行重新采样。

5.4.2 基于屏幕的抗锯齿

如果不进行采用合适的采样和filter,三角形的边缘能够产生明显的锯齿。阴影的边界,镜面反射的高亮,以及其他类似的像素颜色值大幅度变化都会造成类似的问题。本小节我们所讨论的算法能够改善这一类问题的渲染质量。它们的共同点是,这些问题都是以屏幕为基础的,例如,它们只需要处理渲染管线的输出即可。世上并没有一种所谓的最好的抗锯齿技术,我们需要根据场景的变化,内存效果,GPU的需求来选择最合适的抗锯齿技术。

在上一小节提到的黑色三角形例子中,有一个问题是低采样率。我们在每个像素网格单元的中心进行采样,所以我们只知道网格单元的中心是否被三角形覆盖。如果基于每个网格单元采样更多的点,再将这些采样点以某种形式进行融合,那我们就能够计算出更优的颜色值。如下图所示。

大体来说,基于屏幕的抗锯齿技术都是使用某种采样模式,之后对采样点进行加权以得到像素的颜色p

其中,n表示一个像素的采样点数量。函数c(i,x,y)是一个采样点的颜色,wi表示权重,其范围是[0,1],而这个采样点会影响最后该像素的颜色。而采样点的位置则取决于其索引i,而函数也可能会使用像素位置(x,y)的整数部分。换句话说,每个采样点在屏幕网格中的位置都是不同的,而每个像素的采样模式也可能是不同的。在实时渲染系统中,我们一般会使用点采样。所以,函数c可以被认为是两个函数的组合。首先,函数f(i,n)会读取采样点位于屏幕中的浮点数坐标(xf,yf)。之后基于这个屏幕坐标进行采样,例如,读取该精确坐标点上的颜色值。之后,选择采样模式,而渲染管线会根据每一帧的设置计算子像素点的颜色,并以此作为采样。

而另一个值为wi,其表示每一个采样的权重。所有采样的权重值相加等于1。在实时渲染系统中,一般我们会选择一个统一的权重值,例如wi=1/n。

抗锯齿算法中,基于每个像素点,我们所使用的采样点超过1个,那么该算法被称为supersampling(超采样)。理论上来说,最简单的抗锯齿技术就是full-scene antialiasing(FSAA),其以更高的分辨率绘制整个场景,之后对相临的采样进行filter以创建最终的图像。例如,假设我们需要一个1280×1024的图片。如果我们以2560×2048来渲染一张图片(当然,用户无法看到这张图片),之后对每个2×2区域没的像素进行平均,所以我们通过4个采样点来生成每一个像素,之后使用box filter。而这一方法对应下图的2×2 grid的采样模式,如下图所示。

这个方法的开销较大,因为每一个子采样点都必须被着色并被绘制,同时z-buffer的分辨率也需要相应增加,以对应每一个子采样点。FSAA的主要优势是“简单”。此外,我们还能够使用效果稍差的采样模式,例如,只在横向或者纵向进行超采样,采样的范围是1×2或者2×1。一般来说,如果使用该抗锯齿技术,我们会使用2的幂次方作为分辨率,且使用box filter。NVIDIA的dynamic super resolution(动态超级分辨率)是一个更先进的超采样技术,整个场景以更高的分辨率进行渲染,之后使用13-sample Guassian filter来生成最终的图片。

还有一种与超采样相关的采样技术,其以accumulation buffer为基础。该技术不会使用一个分辨率更高的back buffer,但是像素颜色的每个通道都会占有更多的bit。为了得到一个2✖2的场景采样,我们需要生成4张图片,同时需要将camera沿着屏幕的x轴或者y轴方向移动半个像素。每一张生成的图片都是基于网格单元中不同的采样位置。对于实时渲染系统来说,每一帧重复渲染同一个场景并且将计算结果在拷贝至屏幕,这一系列操作的开销过于巨大。然是如果性能对于我们并不重要,那么这一算法可以生成高质量的图片。accumulation buffer过去是硬件中独立的部分。OpenGL的API直接支持这一特性,但是在OpenGL 3.0中其被废弃。在现代的GPU中,我们可以在像素着色器中使用一个更高精度的颜色格式作为输出以实现accumulation buffer的作用。

当我们绘制物体边缘,镜面反射的高亮或者阴影边界时,我们需要额外的采样。我们通常将降低阴影的对比度,将高光效果变得顺滑以避免锯齿。而物体边缘的锯齿仍然是一个主要的采样问题。在渲染时,我们可以检测物体边缘的位置并进行记录,但是这种做法的开销远大于我们进行多个采样点的开销。但是,GPU中例如光栅化和光栅化顺序(Raterizer Order View,指的是DX12中我们可以在像素着色器中根据,像素光栅化的顺序来决定是否要写入该fragment。)

超采样和accumulation buffer,这一类技术中我们生成的采样点都需要经过着色器计算。其开销巨大,但是整体的“受益”却较低,因为每个采样点都会通过像素着色器。

多重采样抗锯齿(Multisampling antialiasing)减轻了上述技术的开销,其只会计算原始像素的的颜色,并将其计算结果供采样点分享。每个fragment可能拥有四个采样位置(x,y),而每一个采样点都有自己的颜色和z-depth,但是像素着色器只会处理一次fragment。如果所有的MSAA采样点都被fragment覆盖,那么我们认为着色的采样点位于fragment的中心。如果fragment只覆盖了较少的采样点,那么我们认为着色的采样点的位置可以被移动至更好的位置。这么做避免了对贴图边界之外的点进行采样。而位置的调整被成为中心采样(centroid sampling)或者中心插值(centroid interpolation),而这个操作完全由GPU负责。中心采样避免了off-triangle的问题,但是可能会引起倒数计算的结果错误。如下图所示。

上图表示,一个像素被两个物体所覆盖。红色的物体覆盖了三个采样点,蓝色的物体覆盖了一个采样点。像素着色器所对应的像素位置由绿色表示。由于红色的三角形覆盖了像素的中心,所以这个位置将用于着色计算。蓝色物体的像素着色器会在采样点①的位置进行着色计算。对于MSAA来说,这四个采样点都拥有独立的颜色和深度值。在右图的EQAA中,四个采样点拥有四个ID,这个ID将会对应采样点的颜色。

MSAA比纯粹的超采样技术更快,因为每个fragment只需要进行一次着色。其只是提高了每个fragment的采样率,并且在采样点之间分享着色的计算结果。通过进一步将采样与fragment覆盖进行分离,MSAA还能够节省更多的内存空间,这也会让抗锯齿的效率更高。在2006年,NVIDIA推出了coverage sampling antialiasing(CSAA),之后AMD也推出了enhanced quality antialiasing(EQAA)。这些技术的原理都是以更高的采样率存储每个fragment。例如,EQAA的“2f4x”模式存储了两个颜色和两个深度值,并在四个采样位置进行分享。其并不会基于特定的采样位置来存储颜色和深度值,而是存储在一个列表中。之后每个采样点只需要一个bit来确定其在列表中对应那一组颜色和深度。其也如上图所示。覆盖的采样点会影响每个fragment最终的颜色。如果存储的颜色超量了,那么其中一个颜色将会被删除,其对应的采样点也会被标记为unknown。这些采样点也不会影响fragment最终的颜色。对大多数场景来说,不太会存在一个像素包含三个以上的fragment。但是为了更高的渲染质量,极限竞速地平线2使用了4倍MSAA,虽然EQAA的性能表现更好。

当所有的几何体都被渲染到多采样点(multiple-sample)buffer中时,GPU会进行resolve处理。这个过程中将会把采样点的颜色进行平均以决定像素的颜色。如果我们使用的HDR格式的颜色,可能任然会出现锯齿。为了避免这一效果,一般我们会在resolve前将颜色值进行tone-map(可以理解为将颜色值从HDR降至LDR)。但是这一操作的开销较大,我们可能会会使用更简单的方法来模拟tone-map。

默认情况下,MSAA会使用box filter。在2007年,ATI推出了custom filter antialiasing(CFAA),其使用tent filter。但这一技术被之后的EQAA所替代。现代的GPU支持在像素着色器或者计算着色器中读取MSAA的采样点,且可以使用任一filter。如果filter越宽越能够缓解锯齿,但是其也会降低对比度。Pettineo发现,在filter的宽度为2或者3个像素的情况下,cubic smoothstep和B-spline filter的效果是最佳的。即使我们使用box filter也会产生性能的消耗,所以当我们使用更宽的filter时也意味着性能的开销更大。

NVIDIA内置的TXAA使用更宽的filter而不是单一像素,这样抗锯齿的效果也会更好。其与更新的MFAA(multi-frame antialiasing)都使用了temporal antialiasing(TAA),这一技术使用了上一帧的抗锯齿结果来改善当前帧的画面。这一技术也使得程序员可以每一帧都设置MSAA的采样模式。

想象一下,生成一些列图片来“手动”进行采样,也就是说每个render都在像素内使用一个不同的位置来进行采样。我们只需要在投影矩阵中加入一些微小的位移即可。而生成的图像越多,那么平均之后的抗锯齿效果也会越好。在TAA中就使用了这一技术。单张图像可能是由MSA或者其他抗锯齿所生成,而之前的图像将会与其进行blend。一般来叔,我们只会使用前两帧或者前四帧的画面。越是靠前的画面,其权重值越是低,但是如果游戏中的camera并未移动,场景并未改变,其会造成画面的闪烁。所以通常上一帧与当前帧拥有相同的权重。由于每一帧的采样都位于不同的子像素位置,这些采样点的加权总和能够更好地覆盖边界。这样,我们就不需要额外的采样点了,这也这一类方法的优势。甚至我们可以使用临时采样(temporal sampling)来生成一个分辨率较低的图像。此外,其他需要进行大量采样的的技术,例如光照模型等等,也能减少采样的数量,因为每一帧的画面都需要通过前几帧的画面进行融合(blend)。

当我们使用上述技术进行静态场景的抗锯齿时会产生一些问题。如果每一帧的画面的权重值并不相同。那么在静态场景中的物体就会闪烁。而高速移动的物体可能会产生残影,由于其对前几帧的画面会影响当前帧的画面。对于残影,我们的解决办法是,只对移动缓慢的物体使用上述抗锯齿技术。另一个方法是重新投影以前几帧与当前帧中的物体。也就是说,物体的位移向量会被存储在“velocity buffer”中。这些向量将用于关联上一帧和当前帧的物体,例如,当前像素的位置将减去向量以求出在上一帧时当前像素的颜色。在当前帧中不可能是物体表面的采样将被舍弃。因为我们并没有使用额外的采样点,所以这一算法的开销并不大,而近几年对于TAA的使用与研究也增长迅速。还有一个原因,是因为延迟着色技术并不适用于MSAA或其他多重采样。

采样模式

有效的采样模式是减少锯齿的关键点。Naiman提出,最容易被发现的锯齿一般位于接近水平或者接近数值的边界。而接近45°的斜坡边界也非常容易被发现。Rotated grid supersampling(RGSS)使用一个旋转的正方形使像素内的纵向与横向的分辨率更高。如下图所示。

在RGSS模式是一种Latin hypercube或者N-rooks采样,n个采样点被置于n✖n的格子中,每一行每一列只有一个采样点。也就是说,4个才能够样点将分别“占据”4✖4的格子中的一列和一行。这一模式能够捕捉到相近的横向与纵向的边界。

N-rooks可以被视为一个好的采样模式的基础,但单单使用N-rooks还不够。例如,采用点可能都位于子像素格子的对角线上,如果边界平行于该对角线,那么我们便无法解决边界的锯齿问题。如下图所示。

上图使用了N-rooks的采样模式,但是所有的采样点都位于位于粉色三角形内部,这样的话,该像素的最终颜色将会是粉色而不是粉色与白色的融合。右图中,采样点分布于粉色与白色的部分,这一采样效果明显好于左图。

因此为了更好的采样效果,我们需要避免两个采样点相邻。同时,我们也希望将采样点均匀的分布于n✖n的格子中。

GPU制造商一般会自行设置多重采样的采样模式。下图展示了,一些被广泛使用的MSAA采样模式。

对于TAA来说,其覆盖模式则取决于程序员,因为采样位置每一帧都会变化。例如,Karis发现Halton sequence的表现优于GPU厂商提供的MSAA采样模式。Halton sequence能够在空间中随机生成采样点,但这些采样点又能够均匀分布在空间中,且不会簇拥在一起。

虽然一个子像素格子模式能够较好地模拟每个三角形是如何覆盖屏幕的网格单元,但我们仍然有改进的空间。场景中的物体都非常的小,也就是说,并没有一个特定的采样率可以完美的捕捉每一个物体。

一种解决办法是使用stochastic sampling(随机采样),其能够提供随机性更高的模式。我们在上图中所列举的这些采样模式都是固定的。假设,一个梳子位于camera的前方,而每一个像素能够覆盖一些梳齿。一个固定的采样模式并不能有效地减缓锯齿,因为采样模式要么与梳齿的“频率”相同,要么就是完全不同。但是使用一个随机的采样模式能够缓解这一问题。其中一个解决办法是对每个像素都使用不同采样模式,或者基于时间改变采样点的位置。例如,ATI的SMOOTHVISION允许用户为每个像素定义16种采样模式。Molnar以及Keller也发现,使用隔行扫描的随机采样模式能够减少单一扫描模式下的锯齿效果。

还有一些值得我们注意的被GPU支持的采样模式算法。例如,NVIDIA之前的Quincunx。“Quincunx”表示五个物体的组合,四个组成一个正方形,第五个位于正方形的中心。Quincunx的多重采样抗锯齿则采用这一模式,将四个采样点置于像素的四个角。如下图所示。

正方形四个角的采样值将会分配至四个相邻的像素。位于中心的采样点,其权重为1/2,四个角的采用点权重则为1/8。由于分享了像素值,每个像素只需要两个采样点即可。因此,这一技术的效果优于使用两个采样点的FSAA。这一采样模式类似于二维的tent filter。

Quincunx采样模式还能运用于使用单一采样点的TAA。每一帧画面都基于上一帧画面,沿着坐标轴平移了半个像素。因此上一帧画面提供了每个像素正方形四个角的采样点,双向线性插值则快速的计算出采样值对于像素点的影响。每一帧相同的权重值意味着,即使画面是静止的也不会产生闪烁。虽然高速移动物体的重影问题仍然存在,但是这一技术较易实现,且效果好于只使用单一采样点的的模式。

当Quincunnx运用于单一帧时,其开销也比较低。而RGSS模式则能提供水平和竖直边界上更好的效果。FLIPQUAD模式是针对移动平台GPU的产物,其兼顾了上述两个模式的特性。它的优势是,每个像素点只需要两个采样点,其效果类似于RGSS(RGSS则需要4个采样点)FLIPQUAD模式如下图所示。

上图中,左侧是RGSS采样模式。每个像素夙瑶4个采样点。如果我们将采样点移动至像素的边缘,那么相邻的像素可以分享一个采样点。但是,相邻像素的采样模式需要互相“对称”,如右侧的图片所示。

与Quincunx相同,只使用两个采样点的FLIPQUAD也可以用于TAA。

Morphological Methods

锯齿通常由边缘造成,例如几何体的边缘,高对比度的阴影,或者光线的高亮。了解锯齿的结构能让我们更好地进行抗锯齿操作。在2009年,Reshetov首先提出了相关算法,其被命名为morphological antialiasing(MLAA)。“morphological”意味“与结构或者形状相关”。不过早在1983年,Bloomenthal已经开始这方面的研究。Reshetov的论文则表面,除了多重采样的方法,我们也应该致力于重构边缘的研究。

这一类的抗锯齿技术类似于post-process。也就是说,我们正常的管线进行渲染,之后将渲染的buffer再次处理一生成抗锯齿的结果。自2009年起,这一领域的技术被大大拓展。一些依靠额外depth buffer和法线buffer的相关技术则能提供更好的效果,例如,subpixel reconstruction antialiasing(SRAA,子像素重构抗锯齿),但是其只能运用于几何体的边缘所造成的锯齿。其他分析方法,例如geometry buffer antialiasing(GBAA,几何buffer抗锯齿)和distance-to-edge antialiasing(DEAA,边缘距离抗锯齿),其会计算三角形边缘的位置并检测像素中心点到三角形边缘的距离。

最为常用的技术则只需要color buffer,这也意味着该技术也能运用于阴影,高光或者其他原因所造成的锯齿。例如,directionally localized antialiasing(DLAA,方向性位置抗锯齿),其理论为如果一个边界是竖直的,那么其应该在水平方向进行blur,同样,对于水平的边缘则应该进行纵向blur。

其他更为精确的边缘检测则会尝试找到包含边界的像素并计算其覆盖率。包含边界的像素的相邻像素也会进行检测,目的是为了尽可能的重构原始边界的位置。边界对于像素的影响会被用于与相邻像素的颜色进行融合blend。如下图所示。

上图中,左侧的图片表示锯齿的图片。而我们的目标是计算出边界的大致方向。中间的图片,我们通过检测相邻的像素计算出了边界的方向。基于我们的采样点可以求出两条可能的边界。右侧的图片,我们使用最有可能的边界来融合中心像素和相邻像素。我们将重复这个过程,直到遍历图像中所有的像素。

Ioucha通过检测像素的MSAA采样点,改进了边界寻找算法。需要注意的是,边界预测和融合的精确度高于基于采样点的算法。例如,一个像素点使用四个采样点,那么它只能提供5种融合:没有采样点被覆盖,一个,两个,三个或者四个被覆盖。而预测的边界位置可以更多,所以其效果也会更好。

但是这些基于图像的算法也可能“误入歧途”。首先,我们可能无法检测到边界,如果像个物体的颜色相差不大,或者小于算法的极限值。如果像素点包含三个或者更多的表面,那么我们很难进行检测。对比度较高的表面,那么像素与像素之间的颜色变化较快,这一类算法可能会错误地绘制边界。当我们使用MLAA时,文本的显示质量通常会比较差。物体的转角也会是一个问题,因为算法可能将一个正方形的转角显示为一个圆角。带有弧度的线也可能被影响,因为这一算法假设,边界是直线。一个像素的改变可能会导致整个边界被重构,这样每一帧画面之间会有明显的问题。一个缓解的方法是使用MSAA的覆盖mask来改善边界的检测。

如果一个物体的宽度小于一个像素,例如,电线或者绳子,那么只要物体没有覆盖像素的中心点,屏幕上会有间隙。如果我们能够使用更多的采样点就可改善这种情况;如果只使用基于图像的抗锯齿算法则不能。此外,根据场景的不同,这一算法的处理时间也会改变。例如,一片草地的处理时间可能是单纯的天空的处理时间的三倍。

也就是说,基于图像的抗锯齿方法的内存与处理开销较小,因此其运用于许多应用。其中只检测颜色的抗锯齿不属于渲染管线,使得这一类的抗锯齿可以很简单的启用或者禁用。其中最常用的两个算法是fast approximate antialiasing(FXAA,快速抗锯齿)subpixel morphological antialiasing(SMAA)。这两个算法只使用颜色值作为输入,其中SMAA能够读取到MSAA的采样点数据。这些算法都有各自不同的设置,都是抗锯齿质量和运算时间之间的平衡。其开销一般为1到2毫秒每帧,对于实时渲染游戏来说,这个时间是可以接受的。最后,这两个算法也能够使用TAA。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据