游戏开发中的抗锯齿算法

转自
https://blog.csdn.net/qq_36696486/article/details/105076650
https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/11%20Anti%20Aliasing/

锯齿由来

锯齿的来源是因为场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组。所以判断一个点到底没有被某个像素覆盖的时候单纯是一个“有”或者“没有"问题,丢失了连续性的信息,导致锯齿。

场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一个三角形,我们就要判断屏幕上哪个点在三角形当中,然后将它绘制出来。
在这里插入图片描述
图中显示,有的像素点全部在三角形中,有的部分在其中,有的完全没在其中,但是在屏幕上绘制的时候却不能只绘制像素点的一部分,要么不绘制,要么就整个像素点都绘制。所以绘制完成就出现下面的锯齿情况:
在这里插入图片描述

抗锯齿算法

首先说明一下,抗锯齿算法应用于硬件,且在光栅化阶段执行。
锯齿的出现可以简单理解为像素精度不够,那么如何巧妙的提升像素精度呢?

SSAA

简单地说就是放大屏幕分辨率以平滑锯齿
超级采样抗锯齿 (Super-Sampling Anti-aliasing),也叫SSAA,其原理比较好理解,就是直接“放大屏幕分辨率”。假设屏幕分辨率为800x600,那么4xSSAA会将屏幕渲染到1600x1200的缓冲区上,然后在下采样到800x600,SSAA可以得到非常好的抗锯齿效果,不过SSAA需要的计算量是非常大的,光栅化和片段着色器都是原来的4倍,渲染缓存的大小也是原来的4倍。4xSSAA就是放大4倍的意思。因为SSAA要浪费大量内存,因此基本没有大量应用。

MSAA

简单地说就是用多个采样点来采样一个像素点
多重采样抗锯齿 (Multi-Sampling Anti-aliasing),MSAA是对SSAA的改进,放弃了扩大像素分辨率,使用多重采样的方式,既然有多重采样,就有“单重采样”,而传统的采样方式就可以理解为“单重采样”,当然并不存在“单重采样”这个东西了。姑且这样叫它。“单重采样”就是一个像素点与一个采样点进行对应,而“多重采样”则是一个像素点与多个采样点进行对应。如图:
在这里插入图片描述
看图就好理解了:此图是4MSAA,即一个像素点对应4个采样点,对于边界,我们根据其像素点包围的点数来计算其颜色值,比如边界像素点包含2个采样点,那么它最终的颜色就应该是本来的颜色2/4,同理,如果包含一个,就是颜色*1/4,最终 的效果如下:
在这里插入图片描述
这样看起来“圆滑”很多。其有点比较突出,效果也不错,但是
注意,它不适合延迟渲染,这里说的不适合并不是不支持,延迟渲染也能支持MSAA,但是支持他就会大量浪费空间
延迟渲染是什么,在这里不做过多介绍,总之他为了优化光照着色,需要一个GBuffer,这个就是临时渲染出的结果的缓存因为需要GBuffer,所以MSAA也需要进行临时保存,那么保存临时数据的后果则是浪费大量显存。

前面可知4x MSAA的显存消耗是4x的关系,假设我们按照2k的原生分辨率来做,一个RT就是64 MB,用来做MSAA的那个RT就会是不低于256MB。又因为GBuffer至少存depth,normal,basecolor3张RT,那三个MSAA RT就是768MB,这种消耗非常巨大,因此可以理解为“不支持”

CSAA

覆盖采样抗锯齿(Coverage Sampling Anti-Aliasing,简称CSAA)是NVIDIA在G80及其衍生产品首次推向实用化的AA技术,也是目前NVIDIA GeForce 8/9/G200系列独享的AA技术。CSAA就是在MSAA基础上更进一步的节省显存使用量及带宽,简单说CSAA就是将边缘多边形里需要取样的子像素坐标覆盖掉,把原像素坐标强制安置在硬件和驱动程序预先算好的坐标中。这就好比取样标准统一的MSAA,能够最高效率的执行边缘取样,效能提升非常的显著。比方说16xCSAA取样性能下降幅度仅比4xMSAA略高一点,处理效果却几乎和8xMSAA一样。8xCSAA有着4xMSAA的处理效果,性能消耗却和2xMSAA相同。

FSAA

FSAA(Fast Approximate AA)的核心思想是正常采样一个三角形,如果该三角形存在锯齿,则通过边缘检测查找出边界区域,然后使用没有锯齿的线段去替换有锯齿的边界,该方法和采样无关,因此速度很快。

TAA

TAA(Temporal AA),该方法的核心思想是复用上一帧渲染出的结果,并整合到本帧中,从时间上复用以前的计算结果,对于静止的图像优势明显。

猜你喜欢

转载自blog.csdn.net/J_avaSmallWhite/article/details/113854686