多重采样反走样(Multisample anti aliasing)技术,简称MSAA,是实时渲染中解决抗锯齿问题的一个常用方法。今天将对该算法的思想予以介绍。
Aliasing
想了解该算法的思想,就要首先明白锯齿是如何产生的。渲染中的锯齿又称走样(Aliasing),是渲染管线在进行光栅化时,由于屏幕像素的离散限制所产生的锯齿状边缘。举个例子,下图使我们在渲染一个三角形:
对于每个像素,我们取它的中心点,根据中心点是否在三角形内来判断该像素是否渲染三角形。以这种方式来渲染的话,渲染结果就如下图所示:
可以看到,对于三角形的斜边,因为屏幕像素并不是无限的,因此以这种方式渲染必然会出现锯齿状边缘。这就是Aliasing。
SSAA
超采样反走样(SSAA)是一种支持抗锯齿的方法。它的做法也很简单:假设我们的屏幕像素为800600,那么我们只需要将渲染的texture扩大4倍(16001200),然后再把相邻像素值做一个过滤(比如平均等)得到最终的图像就可以解决这个问题了。利用该方法确实可以从根本上消除锯齿,但是这种方法大大提高了存储空间和计算量,所以一般不会使用这种技术。
MSAA
后来人们提出了多重采样的方法。它的思路如下:
对于每个像素,不要仅用一个中间点来判断三角形是否覆盖,而是取4个顶点来分别判断:
左图是不采用MSAA的做法,那么这个像素就没有被三角形所覆盖。右图用四个均匀分布的点来判断,那么有两个点就被三角形覆盖了。
下图是采用每像素4个点的三角形覆盖判断:
在具体的计算中,对于每个像素,fragment shader只需要算一次。对每个采样点赋以颜色值,最终将四个采样点的颜色平均就可以得到像素的颜色。如下图所示:
这样一来,就可以取到较好的抗锯齿效果。计算量不会有太大变化,但是存储量则要*4(因为多了四个采样点,每个采样点也要存颜色值)。
下图展示了原始图像和运用了MSAA的图像,可以看到抗锯齿的效果还是比较明显的: