光栅化
光栅化的任务
将在投影变换中得到的正则立方体显示在屏幕上
屏幕 screen
-
像素(pixels)的集合。
-
屏幕的大小使用分辨率(resolution)来刻画。
-
经典的光栅显示设备
像素 pixel
-
像素是一个具有统一颜色的小立方体
-
颜色由三部分组成red, green, blue
屏幕空间
屏幕被划分成一个个正方体,称为像素。像素使用坐标(x,y)(x, y)(x,y)来表示,其中心是(x+0.5,y+0.5)(x+0.5, y+0.5)(x+0.5,y+0.5), 范围是(0,0)(0,0)(0,0)到(width−1,height−1)(width-1,height-1)(width−1,height−1)。
光栅化的步骤
光栅化主要分为两步
- 将正则立方体的X,YX,YX,Y轴坐标变换到[0,width]×[0,height][0,width]\times[0,height][0,width]×[0,height]
- 将得到的图形画到屏幕像素上。
光栅化第一步 视口变换 viewport transformation
先缩放然后平移,变换过程中与z无关,变换矩阵如下所示。
(width200width20height20height200100001)
\begin{pmatrix}
\frac{width}{2} & 0 & 0 & \frac{width}{2}\\
0 & \frac{height}{2} & 0 & \frac{height}{2}\\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1
\end{pmatrix}
⎝⎜⎜⎛2width00002height0000102width2height01⎠⎟⎟⎞
光栅化第二步 光栅化三角形到像素
这里关心的问题是如何将连续的三角形平面放到不连续的像素中显示。
最简单的光栅化方法:通过采样来解决,将像素中心在三角形内部的像素采样出来,然后用这些采样出来的像素点来代表三角形。
这里,判断点PPP在三角形内部的方法使用了叉积,首先规定规定一个走向,如AAA->BBB->CCC,然后按走向来依次计算3个叉积,如下所示
a⃗=AP⃗×AB⃗b⃗=BP⃗×BC⃗c⃗=CP⃗×CA⃗
\vec{a}=\vec{AP}\times\vec{AB}\\
\vec{b}=\vec{BP}\times\vec{BC}\\
\vec{c}=\vec{CP}\times\vec{CA}
a=AP×ABb=BP×BCc=CP×CA
若PPP在三角形内部,则a⃗,b⃗,c⃗\vec{a},\vec{b},\vec{c}a,b,c的方向相同。
但是采样会带来新的问题——走样 aliasing,这些问题都被称为sampling artifacts,例如
-
锯齿(jaggies),空间采样不充分导致的。
-
摩尔纹(moire),图像采样不充分导致的。
-
wagon wheel effect,时间采样不充分导致的。
解决上述问题的方法——反走样,其基本思路是在采样之前进行模糊化处理(pre-filter),然后再采样。模糊化处理实际上是在采样之前使用低通滤波器过滤掉高频部分,目的是使边缘模糊化。
实际的做法是使用超采样(supersampling MSAA),其基本思路是将一个像素再划分为多个小的部分来采样,然后每个像素的值是像素中所有的小的部分的平均值。