1.什么是光栅化?
在前面的章节里提过,光栅化(Rasterization)就是将物体投影在屏幕上的图形,依据像素打散,每一个像素中填充不同的颜色。
如下图中的老虎,可以看到屏幕上有各种多边形,这些多边形经过各种变换和操作后,会形成屏幕空间的多边形。这样还不够,还需要进一步将多边形打散成像素,告诉每个像素的值应该是什么,这一步的过程就是光栅化。
2.三角形网格
在图形学中,三角形网格(Triangle Meshes)构成了物体表面结构,如下图所示为三维物体和二维物体,都是用三角形构成而来。
那么为什么使用三角形作为基本形状单元(Fundamental Shape Primitives)呢?因为有如下优点:
1.因为三角形是最基础的多边形:
任何多边形都可以用三角形组成,任何多边形都可以拆成三角形。
2.三角形独特的性质:
三角形内部一定是个平面,在三角形内部给定三个点连成一个三角形一定是一个平面。
三角形内外定义非常清晰,可以通过向量叉乘来判断点是否在三角形内部。
定义良好的三角形顶点插值方法,实现颜色的平滑过渡。
3.采样
那么如何将三角形填充到屏幕像素中呢?如下图所示:
这里就用到了采样(Sampling)。所谓采样就是一个连续的函数f(x)在不同x值拿到这个函数的值是多少,相当于把一个函数给离散化的过程。采样在图形学说是非常重要的概念,会有各种各样的采样,这里说的采样是指利用像素的中心对屏幕空间进行一个采样。还可以采样时间、位置、法线,反射光等。
3.1三角形采样
利用像素的中心对屏幕空间进行采样,就是判断每个像素的中心是否在三角形内部。如下图所示:
定义一个二进制函数inside(t,x,y),这个函数的作用是给一个屏幕空间中的任意一个点Point(x,y),判断这个点是否在三角形内部,如果在三角形内返回1,否则返回0。
那么使用这个函数对屏幕空间上所有点进行计算,如下示意代码:
判断点是否在三角形内部则是通过向量叉乘的方法实现,在前面线性代数的章节中有解释。那么,如果一个像素点中心刚好在三角形边缘怎么处理?有规范参照规范,没有规范自己决定是否在三角形内部或外部。如下图所示:
3.2采样过程优化
上述对一个三角形进行采样的时候,把屏幕上所有的像素都进行了遍历,如果改三角形只是占屏幕中很小的范围,那么就会造成极大的浪费。这时,就需要进行优化。
3.2.1 AABB包围盒
如下图所示,左侧白色部分肯定不在三角形内部,右侧蓝色区域为三角形覆盖的最大区域,给定一个包围盒,指轴向包围盒,称为AABB包围盒(Axis-Aligned Bounding Box)。而在包围盒之外区域的像素点自然不需要去判断了。
3.2.2逐行检测
当一个三角形本身覆盖不了多少像素,但是使用AABB包围盒覆盖了很多像素,比如很窄长又旋转的三角形。对于这种情况,使用AABB包围盒检测方式有些浪费,这时候可以进行逐行检测,就是从三角形左下角开始往右检测,检测完一行再检测上一行,直到检测完最上一行。如下图所示:
3.3采样分类
3.3.1位置上的采样
对于任何一个拍出来的照片,如果放大都可以看到一个个格子,也就是在分辨率上的像素。图像信息到达感光元件时,把他们离散为屏幕上一个一个的像素,这么一个过程的采样,就是位置上的采样。如下图所示:
3.3.2时间上的采样
采样不仅发生在不同位置,也可以发生在不同的时间。在不同时间段采样就是时间上的采样。比如视频、动画都是一帧一帧播放的,每一帧就是一张图,将每一张图片叠加在一起就是如下图所示:
4.走样
走样(Aliasing),表示失去原来的样子。在图形学中表示在光栅化三角形的时候,得到的结果与原本变样了。常见的走样有锯齿(Jaggies)、摩尔纹(Moire)、车轮效应(Wagon wheel effect)。
4.1锯齿
上述采样过程中,得到判断后在三角形内部像素的中心点。如下图所示:
然后给对应的像素点填充上红色的颜色,就得到下面的左侧图,而实际上的三角形应该是右侧的样子。这种情况称为锯齿。注意:这里是每个像素代表一个小方块,但是实际上的成像屏幕像素并不这么简单,只是方便理解。
如下图所示,可以明显看到放大后三角形产生了锯齿。
4.2摩尔纹
如上图所示,把左边图所有奇数行和奇数列像素都去掉,然后把剩下的图像拼接到一起(相当于缩小了照片),然后依旧按照原始大小进行显示,就会出现左边所示的摩尔纹。在日常生活中用手机去拍屏幕也会产生一系列的条纹。
4.3车轮效应
在生活中,有些高速行驶的汽车,但是我们的眼睛看他的车轮却反而像是在倒着转,这也是采样所导致的,我们称之为车轮效应。造成这个问题的原因是人眼在时间上的采样,跟不上运动的速度,时间上采样慢也就是采样频率低。
4.4产生走样的原因
上述三种情况也被称为Sampling Artifacts,当然还有其他情况。锯齿和摩尔纹都是在空间或者位置上采样产生的问题,而车轮效应是在时间上采样产生的问题。总结就是,信号(函数)变换太快,采样速度太慢。采样速度也就是采样频率。
4.2.1采样频率
采样频率可以理解为抽取样本的间隔。应用到光栅化里面,我们可以把三角形当做无数的点组成,而我们屏幕又是由一个个的像素组成,这些像素的中心点对应到三角形中的某些点,等同于所有点中抽取出的样本。那么采样的间隔自然是我们像素的实际物理大小。因此若屏幕大小不变,分辨率变高(即像素越多,像素的中心点物理间隔越小),采样频率越高。
那么,产生了走样如何解决?将会在下一章说明。