跳转至

光栅化

光栅化(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):使用深度学习模型对图像进行超采样,可以在保持较低计算成本的情况下获得更好的效果