Lecture 5: Rasterization 1(Triangles)¶
Perspective Projection¶
这个变换使用的矩阵是上节课提到的投影矩阵 (Projection Matrix)。它的作用是将不规则的视锥体空间(即摄像机视野),扭曲成一个非常规整的标准立方体 (Canonical View Volume / Clip Space),这个立方体的xyz坐标范围通常都是 [-1, 1]。
MVP:model-View-Projection(模型-视图-投影)
Canonical Cube to Screen¶
光栅化的过程是把图形转换为像素的过程。
像素\((x, y)\)的中心在\((x + 0.5, y + 0.5)\)处。屏幕显示范围从\((0, 0)\)到\((W, H)\),其中\(W\)是宽度,\(H\)是高度。
Viewport变换将标准立方体[-1, 1]映射到屏幕坐标系,其使用的矩阵为:
其几何意义是先将标准立方体[-1, 1]映射到[-W/2, W/2]和[-H/2, H/2],然后平移到屏幕坐标系。
Triangles¶
三角形是计算机图形学中最基本的图元。它由三个顶点组成,每个顶点都有一个位置和颜色等属性。
采样¶
采样是将连续的图形数据转换为离散的像素数据的过程。采样可以通过对三角形进行光栅化来实现。
以三角形的采样为例,定义一个函数\(inside\),规定:
所以光栅化的过程可以表示为:
C++ | |
---|---|
那么如何判断点\((x, y)\)是否在三角形内呢?可以使用向量叉积法。
叉积法判断点在三角形内¶
对于三角形的三个顶点\(A\), \(B\), \(C\),可以计算向量\(AB\)和\(AC\),以及点P\((x, y)\)到这三个顶点的向量。然后通过叉积判断点是否在三角形内,即:
更简洁的等价方式¶
在实践中,通常会采用一种更简洁的等价方法。该方法要求首先确定三角形三个顶点A, B, C的环绕顺序(例如,统一为逆时针)。
假设顶点A, B, C是按逆时针顺序排列的,那么一个点P在三角形ABC内部(或边界上)的充分必要条件是:点P必须位于有向线段AB、BC和CA的同一侧(左侧)。这可以通过以下三个叉积的符号来判断:
这里的关键点是:
- 如果A, B, C是逆时针顺序,那么上述三个叉积都应该大于等于0。
- 如果A, B, C是顺时针顺序,那么上述三个叉积都应该小于等于0。
为了降低开销,实际判断inside函数时不会将所有点都计算一次,而是会使用一个包围盒(Bounding Box)来快速排除不在三角形内的点。而且可以使用类似行扫描的方式来找到每一行的最小和最大x坐标,从而减少需要检查的点数。