光栅化¶
光栅化(Rasterization)来自德语单词“Raster”,意为栅格、网格。在计算机图形学中,光栅化是指将几何图元(如线段、多边形等)转换为屏幕上的像素的过程。
视口变换¶
视口变换(Viewport transformation)是将规范化设备坐标 NDC 转换为屏幕坐标的过程,会将 \([-1, 1]^2\) 的 XY 平面映射到 \([0, width] \times [0, height]\) 的屏幕坐标系中。
视口变换矩阵为:
\[
M_{viewport} =
\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}
\]
三角形光栅化¶
光栅化的输入是三角形顶点在屏幕上的投影位置,输出是三角形覆盖的像素,最终将连续的三角形片段转换为离散的像素。
三角形光栅化最简单的方法就是点采样,即遍历每个像素,判断像素中心是否在三角形内部,如果在则将像素填充为三角形的颜色。点采样一方面可以使用包围盒(Bounding Box)来减少需要检查的像素数量,另一方面可以使用以下方法来判断像素是否在三角形内部:
- 向量叉乘:对于三角形的三个顶点 \(A, B, C\) 和点 \(P\),若 \(AP \times AB, BP \times BC, CP \times CA\) 同号,则说明点 \(P\) 在三条线段同一侧,即在三角形内部
- 重心坐标:对于三角形的三个顶点 \(A, B, C\) 和点 \(P\),若 \(P\) 可以表示为 \(P = \alpha A + \beta B + \gamma C\),且 \(\alpha, \beta, \gamma \geq 0\) 且 \(\alpha + \beta + \gamma = 1\),则说明点 \(P\) 在三角形内部
另一种光栅化算法是扫描线(Scanline)算法,它会先对三角形的三个顶点按 Y 坐标排序,然后从上到下扫描每一行像素,计算出每一行的左右交点,然后填充像素之间的颜色。扫描线算法的优点是可以处理任意多边形,但需要对多边形进行分解,且对于凹多边形需要特殊处理。
抗锯齿¶
空间上采样不足会出现锯齿(Jaggies),时间上采样不足会出现车轮错觉(Wagon-wheel effect),采样频率低于具有高频表面的物品会出现摩尔纹(Moire),这些现象被统称为采样失真(Sampling Artifacts),也被称为混叠(Aliasing),本意是在给定采样率下无法区分的两个不同的频率信号。
抗锯齿(Anti-aliasing)是一种在保持采样频率不变的情况下,减少采样失真的技术。常见的抗锯齿方法有:
- 预滤波(Pre-filtering):在采样前先对信号进行滤波(如高斯滤波),去除高频成分,然后再进行采样
- 超采样(Supersampling):在采样时将像素分成多个子像素,对每个子像素分别进行采样,然后取平均值,可以细分为:
- 超级采样抗锯齿(Super-Sampling Anti-Aliasing,SSAA):直接在更高分辨率的图像上进行采样,然后缩小到目标分辨率,计算成本极高
- 多重采样抗锯齿(Multi-Sampling Anti-Aliasing,MSAA):只对边缘的像素进行超采样,混合不同采样点的颜色
- 时间性抗锯齿(Temporal Anti-Aliasing,TAA):每个像素只采样像素中心,将多帧的结果混合,通过连续帧之间的抖动来减少锯齿,在动态场景中可能会出现运动模糊的问题
- 快速近似抗锯齿(Fast Approximate Anti-Aliasing,FXAA):对图像进行边缘检测,然后对边缘进行模糊处理,是一种后期处理的抗锯齿方法,计算成本非常低
- 深度学习超采样(Deep Learning Super Sampling,DLSS):使用深度学习模型对图像进行超采样,可以在保持较低计算成本的情况下获得更好的效果