1.什么是光栅化
将几何图形绘制到屏幕上的过程叫做光栅化,我们对屏幕的定义如下
- 屏幕是像素的数组
- 分辨率是屏幕像素数组的尺寸
- 屏幕是光栅成像设备。
**光栅化(Rasterization)**指的是将物体绘制到屏幕上。**像素(Pixel)**是具有统一颜色的小方块,是由不同颜色组合而成的(例如 RGB)。
1.1屏幕空间(像素坐标)
我们认为屏幕左下角为原点,向右为 x 轴,向上为 y 轴。建立平面直角坐标系。屏幕空间满足以下几点
- 我们认为像素坐标 (𝑥, 𝑦 ) 为整数坐标;
- 像素坐标覆盖范围为 (0, 0) 到 (width − 1, height − 1);
- 像素的中心点在 (𝑥 + 0.5, 𝑦 + 0.5);
- 整个屏幕的覆盖范围在 (0, 0) − (width, height).
1.2 三角形光栅化
对于一个 3 维图形我们可以用三角形去表示一个一个小面。使用三角形的主要原因是:
- 三角形是最基本的多边形;
- 任何多边形都可以拆分成三角形;
- 空间内任何三个点的连线一定是平面;
- 三角形有清晰的内部和外部定义;
- 三角形只要定义顶点的属性就可以计算三角形内部点的渐变关系(三角形的内部插值)。
对于一个三角形,如何映射在像素空间上问题,可以转换成判断一个像素和三角形的位置关系。最简
单的方法就是进行离散化(Sampling)。采样就是连续函数的离散化过程。代码表示如下
for ( int x = 0; x < max ; ++ x)
output [x ]= f(x);
我们对于给定三角形,判断像素中心是否在三角形内部。如果在,那么这个点为 1,否则为 0
判断代码就可以写为:
for ( int x = 0; x < xmax ; ++ x)
for ( int y = 0; y < ymax ; ++ y)
image [x ][ y] = inside (tri , x +0.5 , y +0.5) ;
对于像素是否在三角形内部的判断,可以使用叉积。具体可以在叉积的讲解部分查看。
对于在边界上的三角形点,可要可不要自己定。为了能够更快速的遍历
像素点,我们可以用以下方法:
- 使用包围盒(Bounding box),只对三角形最大的包围正方形区进行遍历。但是不适用于窄长的三角形
- 找到每一行三角形包围住最左和最右边的点进行遍历。我们的结果可能会生成大量的锯齿,此时我们需要一些方式来消除锯齿。