在进行了上节课的操作之后,所有物体都处在了[-1,1]³的立方体中,接下来就要把他画在屏幕上,这一步就叫做光栅化
在做透视投影时候需要将一个四棱梯挤压成正方体,就需要先定义一个视锥(四棱锥)
那么如何定义视锥呢?

从摄像机看向一个地方,我们把它当作近平面,宽和高是可以定义的,所以宽高比就是可以定义的
- 宽高比 Aspect ratio
- 可视角度 FOV (垂直角度和水平角度可以互相转换)
通过以上两点即可定义一个视锥

要把图像投影到屏幕上就需要先定义屏幕,在图形学中,屏幕就认为是一个装了像素的二维数组。如数组大小1920*1080
像素是最小单位,每个像素由RBG构成
屏幕空间
屏幕坐标系如下图

像素的坐标以左下角为准,如图中蓝色像素坐标为(2,1)
像素的中心为(x+0.5,y+0.5)
继续上节课的话题
如何将[-1,1]³中的东西显示到屏幕上呢?

- 暂时忽略z
- 如果只将
[-1,1]²中的东西显示到[0,width] x [0,height],那么就很简单了
做个缩放并平移就可以,这个变换就被称为视口变换

隔行扫描
老师提到的一个有意思的知识点

以前的显示设备要成像,都是在屏幕上画很多线,画满整个屏幕就形成了一帧画面
隔行扫描就是说
在第一帧只画1、3、5等奇数线
在第二帧只画2、4、6等偶数线
利用人眼的视觉残留特性,这样人们即发现不了画面的异常,还能使机器工作量减半
如今还有某些视频压缩技术采用了这个思想
(但是隔行扫描会造成严重的画面撕裂,特别是对高速运动的画面来说)
三角形

为什么光栅化选择了三角形?
- 三角形是最基本的多边形,没有比三角形边更少的多边形
- 其他多边形都可以拆分为三角形
- 三角形必定在一个平面内
- 容易定义三角形的里外
- 三角形的三个点定义好后,三角形内任意一点可以通过线性的插值来计算得到(重心坐标的插值方法)
如:定义好三个点的颜色,三角形内任意一点的颜色可以通过三个点的颜色来进行插值计算得到
如何将三角形转化为一个一个的像素?

简单近似采样
给定一个连续的函数f(x),当x等于1时得到的f(1)就是1的采样
所以采样就是把一个函数离散化的过程
只要有一个定义在屏幕空间的函数,那么我们就能算出来不同像素中心的值是多少
我们要采样的东西就是
给定一个三角形,在像素的中心进行采样,来判断中心是否落在三角形内

逐像素遍历,判断该像素中心是否在三角形内部,输出到屏幕显示

但是遍历所有像素开销太大,如下图中白色那一列的像素根本没有碰到三角形,所以只要遍历蓝色区域就可以了
我们知道三角形三个顶点的坐标,有了Xmin,Ymin,Xmax,Ymax就可以得到蓝色的区域
蓝色区域就叫做包围盒(轴向包围盒/BoundingBox/AABB)

采样完成后,因为每个像素都是最小单位,像素内的颜色必须一样,所以我们会得到这样一副图

这看起来和初始的三角形差别很大,有一个个的明显锯齿(Jaggies/Aliasing)
下节课就会学习图形学中的重大技术,反走样aka抗锯齿!