Skip to content

光线追踪管线

光线追踪是一种模拟真实光路传播的渲染技术,与光栅化管线的"从物体到屏幕"的投影思路完全不同,光线追踪采用"从相机到场景"的反向追踪方式:从相机发射光线,追踪光线在场景中的传播路径,计算与物体的交互、反射、折射和阴影,最终累积颜色值。

这种技术天然支持全局光照、软阴影、反射折射等高级效果,渲染结果接近物理真实,是电影特效和高端可视化的首选方案。但代价是计算成本极高,每个像素需要追踪多条光线,每条光线可能经过多次反射折射,计算量随场景复杂度指数级增长。近年来随着 GPU 硬件加速(NVIDIA RT Core)和降噪算法的进步,实时光线追踪逐渐成为可能,现代游戏引擎普遍采用光栅化 + 光线追踪的混合管线。

核心思想差异

光栅化和光线追踪的根本差异在于光线的模拟方向。光栅化正向模拟:光源发射光线,照射到物体,反射到相机。但实际计算时完全不考虑光路,只做几何投影和像素填充,光照是事后模拟的。光线追踪反向模拟:从相机每个像素发射光线,追踪其在场景中的传播,计算与物体的交互,递归追踪反射折射,模拟真实光路。

从遮挡处理角度看,光栅化使用深度缓冲,物体绘制顺序无关,光栅化速度极快但遮挡关系是近似的。光线追踪通过求交测试,精确计算光线与物体的交点,遮挡关系是精确的,但求交计算量巨大。

光照效果方面,光栅化的光照是局部的,只考虑直接光照,阴影需要特殊技巧(shadow map),反射折射需要特殊处理。光线追踪的光照是全局的,自然支持间接光照、软阴影、颜色渗透,反射折射是算法天然特性。

主要流程

光线追踪管线虽然不像光栅化那样有严格的硬件管线阶段,但仍可以分解为以下主要步骤,从 CPU 端的场景构建到 GPU 端的并行光线追踪。

场景构建

光线追踪对场景数据的要求与光栅化不同,需要专门的场景加速结构。

  • 任务:

    • 几何预处理:将所有模型转换为三角形网格或隐式曲面(球、圆柱等数学曲面)
    • 加速结构构建:构建 BVH(包围盒层次结构)、KD-Tree 或光束加速结构,用于快速求交
    • 材质与纹理:准备 PBR 材质参数(反照率、金属度、粗糙度)、纹理贴图
    • 光源布置:点光源、面光源、环境光(IBL)、日光
  • 优化点:

    • 静态场景预构建加速结构,动态场景增量更新
    • 使用实例化(Instancing)减少重复几何的内存占用
    • 按材质或空间位置分组,提高缓存命中率

光线生成

从相机为每个像素生成主光线,是整个光线追踪过程的起点。

  • 任务:

    • 相机参数:视口大小、纵横比、FOV(视野角度)、相机位置和朝向
    • 主光线生成:为每个像素计算一条从相机出发,穿过该像素的光线
    • 抗锯齿:每个像素发射多条光线(超采样),随机偏移子像素位置(Jittering)
    • 景深:模拟光圈,从镜头不同位置发射多条光线
  • 优化点:

    • 使用低差异序列(Sobol、Halton)替代随机采样,减少噪点
    • 自适应采样:对高频区域(边缘、反射)更多采样,平坦区域更少采样
    • 分层采样:将像素分成网格,每格采样一次,避免集群效应

求交测试

计算光线与场景中物体的交点,是光线追踪中最耗时也是最核心的步骤。

  • 任务:

    • 加速结构遍历:从 BVH 根节点开始,递归测试光线与包围盒的相交
    • 叶节点测试:对光线与叶节点的三角形进行精确求交(Möller-Trumbore 算法)
    • 最近交点:记录沿光线方向最近的交点,用于后续着色
    • 透明物体:处理多个交点,计算进入和退出点
  • 优化点:

    • 包围盒测试使用 AABB slab 方法,快速剔除
    • 预排序子节点,优先测试更近的包围盒
    • 使用光线包(Ray Packet)并行测试多条光线,提高 SIMD 利用率

局部着色

对每个交点计算直接光照和材质属性,类似于光栅化的片段着色。

  • 任务:

    • 材质求值:根据交点处的纹理坐标采样材质贴图,计算 BRDF(双向反射分布函数)
    • 直接光照:对每个光源生成阴影光线,测试是否被遮挡,累加光照贡献
    • 法线计算:从纹理贴图或几何插值获取法线,用于光照计算
    • 多次散射:对粗糙材质发射多条随机光线,模拟次表面散射
  • 优化点:

    • 使用重要性采样(Importance Sampling)按 BRDF 分布采样,减少方差
    • 光源采样:对面光源按立体角采样,而非均匀采样
    • 延迟材质求值:对间接光照先追踪路径,最后计算材质

递归追踪

这是光线追踪的精髓,递归追踪反射、折射和间接光照光线。

  • 任务:

    • 反射光线:根据入射方向和法线计算镜面反射方向,递归追踪
    • 折射光线:根据斯涅尔定律计算透射方向,处理进入和退出介质
    • 间接光照:随机采样半球方向,追踪来自环境的光线(路径追踪)
    • 菲涅尔效应:根据入射角度和材质计算反射和折射的比例
    • 俄罗斯轮盘赌:随机终止递归,避免无限递归,同时保证无偏估计
  • 优化点:

    • 设置最大递归深度(通常 3-5 次),超过深度的光线返回环境光
    • 使用光束追踪(Beam Tracing)或光锥追踪,近似计算间接光照
    • 路径复用:相邻像素共享部分光线路径,减少计算量

路径追踪

现代光线追踪采用路径追踪算法,通过蒙特卡洛积分计算全局光照。

  • 任务:

    • 随机采样:每次反射按 BRDF 分布随机采样出射方向
    • 通路累积:沿光路累积光照贡献,考虑距离衰减和吸收
    • 多次迭代:每个像素追踪多条路径,平均结果得到无偏估计
    • 环境光采样:对天空盒或环境光贴图采样,处理无限远光源
  • 优化点:

    • 下一事件估计(Next Event Estimation):每步直接对光源采样,结合间接光照
    • 多重重要性采样(MIS):结合 BSDF 采样和光源采样,减少方差
    • 降噪后处理:使用空间滤波或时间累积,减少采样次数

与光栅化管线的对比

方面光栅化管线光线追踪管线
核心思想从物体投影到屏幕从相机发射光线追踪
遮挡处理深度缓冲(Z-buffer)精确求交测试
光照类型直接光照(局部)全局光照(间接)
反射折射需特殊处理(屏幕空间反射、平面反射)算法天然支持
阴影质量Shadow Map(硬阴影或半软阴影)面光源软阴影(精确)
性能特点速度快,实时性好计算量大,实时性差
应用场景游戏、实时渲染电影、离线渲染、高端可视化
硬件加速GPU 通用计算硬件光追单元(RT Core)

现代混合管线

纯光线追踪的计算成本仍然过高,现代游戏引擎普遍采用混合管线:光栅化处理几何和遮挡,光线追踪处理特定的光照效果。

  • 光栅化基础:使用传统的光栅化管线渲染场景,利用深度缓冲和批处理优化
  • 光线追踪增强:在光栅化结果上叠加光线追踪的效果
    • 反射:对反射表面使用光线追踪,而非屏幕空间近似
    • 阴影:对关键光源使用光线追踪软阴影
    • 环境光遮蔽:使用光线追踪计算更准确的 AO
    • 全局光照:对静态场景预烘焙,或使用有限的反射次数

这种混合方案在视觉质量和性能之间取得了平衡,是当前实时光线追踪的主流方案。