1.光栅化
1.1定义
在经过了MVP变换之后,我们需要把3维空间中的任意一个点转到屏幕2维空间上对应的一个位置来,一般假设空间中的物体是由一个一个的三角形组成的,很多的三角形就组成了一个三角形网格(triangle mesh),当然,也是有多边形网格的(polygon mesh)。下面的海豚就是一个三角形网格例子:
在把某个空间中的三角形转到了屏幕上后(只关心x和y坐标),我们要做的就是把三角形在屏幕上对应的像素给描绘出来,这个过程就叫光栅化。
1.2操作
我们假设每个像素都有一个中心,且像素是最小的单位,光栅化的操作就是判断每个像素是否在三角形里面,如果在,那则填充颜色;如果不在,就不填充颜色。如下图所示:
现在关键就是判断一个像素是否在三角形里面,判断方法也很简单,假设三角形的三个顶点依次为A、B、C,要判断的像素点为P,我们只需要做3次右手叉积运算,AB叉AP,BC叉BP,CA叉CP,如果叉乘的结果都为正,即像素点在三角形ABC内部。
在光栅化完成后,三角形对应的像素情况如下:
很明显,光栅化的结果产生了锯齿(jaggies),也就是发生了走样(aliasing)。
2.反走样
上面我们发现光栅化过程中可能会发生走样现象,即产生锯齿,我们要做的就是消除掉这些artifacts,即反走样(antialiasing)。
有一个做法是,先对原三角形进行滤波,然后再采样,如下所示:
还有一种做法就是Multi-Sampling Anti-Aliasing(MSAA),也就是SuperSampling的思路,什么意思呢?就是在一个像素中采样NxN次,比如说2x2,4x4,然后对每个像素中所有小的采样点作一个average。下面就是一个2x2 MSAA的例子:
下面是4x4 MSAA的示例,第一张图是没有MSAA的效果,第二张图是MSAA的效果: