Radiance Caching for Real-Time Global Illumination

Radiance Caching for Real-Time Global Illumination SIGGRAPH 2021

背景与目标

  • 演讲者:Daniel Wright(Epic Games)
  • 主题:介绍 Lumen —— Unreal Engine 5 中的 动态全局光照系统 的核心管线,即 Final Gather(最终采集)
  • 目标平台:次世代主机游戏,同时需要在质量上向上扩展以满足 企业级(Enterprise) 需求

全局光照的核心问题

渲染方程

每个屏幕像素都需要求解的方程(简化表述):

  • :最终像素的出射辐射度(即最终像素颜色)
  • :来自方向 入射辐射度(Incoming Radiance)
  • BRDF(双向反射分布函数)
  • 使用 蒙特卡洛积分 将连续积分离散化为有限采样
  • 通过 光线追踪(Ray Tracing) 获取某方向上的入射辐射度

实时光线追踪的代价

  • 光线追踪本质是一次 非相干的树遍历(Incoherent Tree Traversal)
  • 使用 两级 BVH(Two-Level BVH) 时,实例在空间上重叠的区域需要对同一段光线做 冗余遍历
  • 实际可承受的预算:大约 0.5 ray/pixel
  • 实际需要的采样量
    • 室外场景:约 100 rays/pixel
    • 室内场景:远超 100 rays/pixel
  • 室内是 更难的问题,也是 Lumen 重点优化的方向
  • 预算与需求之间存在 巨大的鸿沟(0.5 vs 数百)

先前方法及其局限

辐照度场(Irradiance Fields)

  • 在世界空间的 网格(Grid) 上放置少量 探针(Probes)
  • 在探针位置预计算 辐照度(Irradiance),然后插值到全分辨率像素
  • 缺点
    • 漏光(Light Leaking)过度遮蔽(Over-Occlusion) 问题严重
    • 探针放置(Probe Placement)非常困难——因为辐射度计算就发生在探针位置
    • 多数实现采用 缓慢的逐步更新 来掩盖瑕疵
    • 由于空间分辨率过低,产生 明显的"平坦感"(Flat Look)

屏幕空间降噪器(Screen Space Denoiser)

  • 从屏幕上每个像素出发追踪光线,通常 1 ray/pixel
  • 依靠 空间复用(Spatial Reuse)时间复用(Temporal Reuse) 来降噪
  • 近期 递归模糊(Recurrent Blur) 的工作质量不错

屏幕空间降噪器的核心问题

  • 问题出在 降噪器运行之前——输入就已经 噪声过高
  • 光线使用 余弦分布(Cosine Distribution) + 固定采样率,无法根据场景自适应
  • 噪声不均匀
    • 靠近高亮光源处噪声较低
    • 远离光源处噪声急剧增大(命中光源的光线比例下降)
  • 降噪器面对高噪声输入只能 增大滤波范围 → 导致 质量下降(过度模糊、细节丢失)
  • 在困难的室内场景中,这一问题甚至是 不可解的(Intractable)

Lumen 的方法:屏幕空间辐射度缓存(Screen Space Radiance Caching)

核心思路

不再从每一个屏幕像素发射光线,而是 将光线打包,从 更少的位置(探针) 发射——即 屏幕空间辐射度缓存

关键设计决策

① 降采样入射辐射度(Downsample Incoming Radiance)

  • 入射辐射度在空间上是相干的(变化平缓),即使几何法线不相干(变化剧烈)
  • 因此可以安全地降采样入射光照
  • BRDF 积分仍然在全分辨率执行,保留全分辨率的间接光照细节

② 在辐射度缓存空间而非屏幕空间做滤波(Filter in Radiance Cache Space)

  • 滤波发生在 探针(Probe)之间,而不是在最终的屏幕像素之间
  • 这带来更好的滤波效果(后文详述)

③ 更好的采样策略(Importance Sampling Incoming Lighting)

  • 预估入射光照的来源方向
  • 向高亮方向发射更多光线 → 重要性采样入射光照
  • 从根本上减少噪声,而不是事后降噪

④ 世界空间辐射度缓存解决远处光照(World Space Radiance Caching)

  • 远处光照用 独立的采样方案 处理
  • 通过 世界空间辐射度缓存 保证远处光照的 时间稳定性

输入质量对比

方法采样率输入质量
Screen Space Denoiser2 rays/pixel噪声极高,困难场景不可解
Screen Space Radiance Cache0.5 ray/pixel噪声显著更低

即使降噪器使用 4 倍 的光线数量,其输入仍然比 Radiance Cache 方案嘈杂得多。


Final Gather 管线总览

整个管线的分辨率层级:

阶段分辨率
世界空间辐射度缓存 (World Space Radiance Cache)最低
屏幕空间辐射度缓存 (Screen Space Radiance Cache)低于最终图像
插值 + BRDF 积分 (Interpolation & Integration)全分辨率
时间滤波 (Temporal Filter)全分辨率

屏幕空间辐射度缓存的具体实现

Screen Probe 结构

  • 所有探针排列在一个 图集(Atlas)
  • 每个探针使用 八面体展开(Octahedral Layout) 将球面方向映射为 2D
  • 默认分辨率:8×8 = 64 个方向 = 64 条光线/探针
  • 八面体布局的优点:
    • 提供 均匀分布的世界空间方向
    • 相邻探针的方向是一致的(Matching Directions) → 可以快速在邻居中找到对应方向 → 对后续的空间滤波至关重要
  • 追踪后存储每个方向的 辐射度(Radiance)命中距离(Hit Distance) 到 Atlas 中供后续处理

Screen Probe 放置策略

采用 逐级细化 的方式:

  1. 起始:每隔 16 像素 放置一个探针(均匀网格)
  2. 检查哪些像素在当前探针下 插值失败(图中橙色标记)
  3. 加倍网格分辨率,在插值失败的位置放置新探针
  4. 重复,直到只剩很少的插值失败像素
  5. 最后对剩余失败像素使用 泛洪填充(Flood Fill) 兜底
  6. 不会 细化到单个像素级别——因为一个探针就是 64 条光线,在单个像素上放置一个探针代价过高

自适应采样(Adaptive Sampling)

  • 为满足实时需求,设定探针总数的 上限
  • 所有探针(包括自适应新增的)统一处理,不做分支
  • 自适应探针放在 Atlas 底部
  • 当 Atlas 空间用尽时,仍然插值失败的像素依赖 泛洪填充 兜底

Screen Probe 抖动(Jittering)

  • 由于探针只在每 N 个像素上放置,需要进行 时间抖动(Temporal Jittering)
    • 抖动 放置网格的位置
    • 抖动 八面体单元格内的光线方向
  • 探针 直接放置在屏幕像素上,确保探针与像素之间 没有间隙/漏光
  • 但因为直接放在屏幕上,同一个 Screen Cell 内不同帧的探针位置不同,会产生 遮挡差异(Occlusion Differences)
  • 这些差异通过 时间滤波器(Temporal Filter) 隐藏
  • 这一设计会带来一些副作用(后文讨论)

屏幕空间辐射度缓存的插值、重要性采样与空间滤波


从辐射度缓存到屏幕像素的插值(Interpolation)

基于平面距离的权重

  • 屏幕空间辐射度缓存(Screen Space Radiance Cache) 插值到全分辨率像素时,需要对周围的 辐射度探针(Radiance Probes) 进行加权
  • 权重依据:像素的 平面距离(Distance from Pixel's Plane)
    • 该平面由像素的 位置(Position)法线(Normal) 共同定义
    • 这样做可以 防止前景未命中的光线泄漏到背景上(即防止前后景混淆导致的漏光)

抖动偏移(Jitter Offset)

  • 在从辐射度缓存插值时,加入 抖动偏移(Jitter) 来改善质量
  • 关键约束:只有当抖动后的位置 仍然位于原始像素的同一平面上 时,才应用抖动
    • 这一点 极其重要,确保抖动本身不会导致插值失败
  • 抖动的作用:
    • 空间上:将探针之间的光照差异分散开来,减少可见的块状伪影
    • 时间上:通过扩展 时间抗锯齿(TAA)邻域钳制范围(Neighborhood Clamp),使最终光照在时间维度上更加稳定

验证正确性

  • 当大幅增加 方向采样数量空间分辨率 后,结果能够 匹配路径追踪器(Path Tracer),证明管线实现正确
  • 但在实际预算( 0.5 ray/pixel )下,室内场景仍然 噪声过高
  • 因此需要在不增加预算的前提下,引入降噪技术

重要性采样(Importance Sampling)

核心动机

回到渲染方程的蒙特卡洛形式:

  • 理想情况下,光线的分布应 正比于被积函数(即
  • 问题:入射光照 恰恰是我们正在求解的未知量——如何估计?

利用上一帧的辐射度缓存估计入射光照

  • 上一帧的屏幕空间辐射度缓存 就是极好的估计来源
  • 具体方法:
    • 将当前帧的屏幕位置 重投影(Reproject) 到上一帧
    • 取上一帧中 四个相邻屏幕探针的平均值
    • 由于辐射度缓存中的光线已按 位置和方向索引,查找非常高效,无需昂贵的屏幕空间搜索
  • 回退机制:当重投影失败(如上一帧中该位置在屏幕外或被遮挡),则 回退到世界空间辐射度缓存(World Space Radiance Cache)

估计 BRDF 分布

  • 在插值阶段已知哪些像素会使用某个屏幕探针
  • 将这些像素的 BRDF 累积 起来,即可得到该探针的 BRDF 分布
  • BRDF 信息直接来自 G-Buffer,因此是准确且无噪声的
  • 例如:位于平坦墙面上的探针,大约 一半方向的 BRDF 为零(指向墙体内部),这些方向完全不需要追踪光线

结构化重要性采样(Structured Importance Sampling)

  • 比单独对 做重要性采样更好的做法:对它们的乘积做重要性采样
  • 这正是 结构化重要性采样(Structured Importance Sampling) 的思路:
    • 将少量采样分配给 概率密度函数(PDF)的层次化结构区域
    • 实现良好的 全局分层(Global Stratification)
  • 原始论文中的采样放置算法需要 离线处理,不适合实时
  • Lumen 的做法:复用其 层次化阈值(Hierarchical Thresholding) 思想,并映射到 八面体 Mip 四叉树(Octahedral Mip Quadtree) 结构上
    • 左侧计算入射光照与 BRDF 的 乘积
    • 右侧在乘积(即 PDF)较高的区域进行 细分(Subdivide)

管线集成

为将结构化重要性采样集成到八面体探针管线中:

  1. 添加间接层(Indirection):让追踪线程知道应该追踪哪个方向
  2. 追踪并计算辐射度 后,将 非均匀布局的辐射度 合成回 均匀探针布局,用于最终积分

光线生成算法(Ray Generation Algorithm)

Compute Shader 中的实现步骤

  1. 计算乘积 PDF:对每个八面体纹素(Octahedral Texel),计算 BRDF × 入射光照
  2. 初始化均匀分布的光线方向:确保每个线程和线程组都有工作做
  3. 按 PDF 排序光线
  4. 裁剪与超采样
    • 3 条 PDF 低于阈值的光线(低贡献光线),用来 细化并超采样 1 条高 PDF 光线
    • 例如:BRDF 为零的方向上的光线被裁剪,重新分配给入射光照与 BRDF 乘积最高的方向

可视化效果

  • 均匀采样(左):约一半的光线浪费在紧贴墙面的方向上,立即命中墙壁,永远不会对最终光照产生贡献
  • 重要性采样(右):这些浪费的光线被重新分配到重要的入射光照方向,仅从可视化即可看出 噪声显著减少

重要性采样的改进

仅根据 BRDF 裁剪(而非光照 PDF)

  • 光照 PDF 仅是近似值,本身存在噪声——上一帧可能恰好 遗漏了某个小而亮的光源
  • 如果根据光照 PDF 裁剪,会导致这些方向永远不被探测到
  • BRDF 是准确的(来自 G-Buffer),且通常 无噪声
  • 因此:只裁剪 BRDF 为零或极低 的光线

更激进的裁剪策略

  • 依赖后续的 空间滤波器(Spatial Filter),可以更激进地裁剪
  • 甚至裁剪 BRDF 大于零但较低 的光线
  • 在空间滤波阶段 降低这些被裁剪方向的权重,以减少 角落处的暗化伪影(Darkening Around Corners)
  • 这样就能将更多的"不重要"光线重新分配给 重要的入射光照方向

最终效果

  • 完全相同的 0.5 ray/pixel 预算 下,噪声 显著减少
  • 本质:不是追踪更多光线,而是 将光线追踪在更聪明的方向上

重要性采样要点总结

关键思想说明
用上一帧光照指导当前帧光线利用时间相干性获取入射光照的良好估计
用远处光照指导光线方向重投影失败时回退到世界空间缓存
将光线打包成探针使得更智能的采样成为可能
高效查找上帧光照辐射度缓存按位置+方向索引,查找极快

辐射度缓存空间中的空间滤波(Filtering in Radiance Cache Space)

核心思路

  • 不在屏幕空间做滤波,而是 在辐射度缓存图集(Atlas)内部做滤波
    • 同时从缓存读取和写入
  • 由于辐射度缓存是 降采样的,滤波核的等效屏幕覆盖范围极大且代价极低:
    • 探针空间的 3×3 核屏幕空间的 48×48 核
  • 关键优势:滤波入射辐射度时可以忽略法线差异
    • 因为入射辐射度不受接收表面法线的影响
    • 只有在最终 Gather 阶段才需要考虑深度加权

从邻居探针采集辐射度(Gather Radiance from Neighbors)

  • 由于辐射度缓存按 位置和方向索引,可以 非常快速 地找到匹配目标方向的辐射度
  • 防漏光启发式(Leak Rejection Heuristic)
    • 将邻居探针的 光线命中点 重投影
    • 计算重投影位置与当前考虑方向之间的 角度偏差
    • 如果角度偏差过大,拒绝该邻居的辐射度
    • 效果:滤波远处光照的同时保留局部阴影

滤波效果

  • 无需追踪额外光线,空间滤波在平坦表面上 大幅减少噪声
  • 但存在问题:毛巾褶皱之间的 接触阴影(Contact Shadows) 丢失了

保留接触阴影(Preserving Contact Shadows)

问题分析

  • 角度误差检测 偏向远处光照(Distant Lighting)
    • 远处光照几乎没有视差(Parallax),因此 永远不会被拒绝
    • 这导致了光照泄漏,接触阴影被远处光照"冲掉"

解决方案

  • 将邻居的命中距离钳制(Clamp)到自身的命中距离,然后再做重投影
  • 效果:
    • 远处光照仍然 极其平滑
    • 同时 恢复了接触阴影(毛巾褶皱之间、毛巾与墙壁之间)

最终对比

  • 探针空间空间滤波在 不追踪任何额外光线 的前提下,显著提升了光照质量

引入世界空间辐射度缓存的动机

远处光照的噪声问题

  • 仅依赖屏幕空间探针追踪时,远处光照的噪声 仍然很大
  • 小而亮的特征(如小窗户、远处灯光) 随着距离增大,噪声 急剧增加
  • 同时这些远距离、非相干的光线追踪 非常耗时,无法简单地增加追踪数量

远处光照的特性——可利用的机会

  • 远处光照在 时间和空间上变化都非常缓慢
  • 这意味着两个优化机会:
    1. 跨帧缓存(Cache Across Frames):在时间维度上复用
    2. 邻居探针复用(Reuse for Neighboring Screen Probes):在空间维度上复用
  • 这就是 世界空间辐射度缓存(World Space Radiance Cache) 的引入动机

世界空间辐射度缓存与远距离光照


问题引出:远距离光照的单独采样

  • 屏幕空间辐射度缓存在处理 远距离光照(Distant Lighting) 时存在不稳定性
  • 解决方案:引入一套独立的 世界空间辐射度缓存(World Space Radiance Cache) 专门处理远距离光照
  • 灵感来源:《The Tomorrow Children》 中 James McLaren 的技术方案
  • 核心优势:探针放置在 世界空间(World Space) 中,误差是 稳定的(Stable Error),因此更容易隐藏瑕疵

在 Final Gather 管线中的位置

  • 屏幕空间辐射度缓存 负责近距离光照
  • 世界空间辐射度缓存 被屏幕空间缓存用于获取 远距离光照
  • 实际划分:屏幕空间缓存处理前 约2米 的光照,超过2米的部分由世界空间缓存接管

管线集成(Pipeline Integration)

基本流程

  1. 在需要插值的 屏幕探针(Screen Probes) 周围放置 世界空间探针(World Space Probes)
  2. 从世界空间探针出发 追踪光线,计算入射辐射度
  3. 将辐射度 插值 到屏幕探针光线上,解决其远距离光照

光线连接(Connecting Rays)

实质上是将 两段光线拼接 在一起(屏幕探针光线 + 世界空间探针光线):

  • 世界空间探针光线:起点需要添加 偏移(Offset),跳过插值覆盖区(Interpolation Footprint)
    • 因为插值覆盖区内的位置已经由该世界空间探针提供远距离光照
    • 必须确保不会在追踪中拾取到 局部光照(Local Lighting)
  • 屏幕探针光线:需要覆盖两段距离——
    1. 自身的 插值覆盖区
    2. 世界空间探针 跳过的距离

漏光问题及解决

问题

  • 两段光线从 不同的起点 追踪,它们之间存在 间隙(Gap)
  • 由于 不正确的视差(Incorrect Parallax),世界空间探针的辐射度本应被遮挡但实际未被遮挡 → 漏光(Leaking)

解决方案:简单球面视差校正(Simple Sphere Parallax)

  • 选择世界空间探针光线时,不再匹配 方向最接近 的光线,而是选择 起点最匹配屏幕探针位置 的光线
  • 这是一种权衡:接受少量方向误差,但确保两段光线之间 没有间隙,从而 消除漏光
  • 效果显著,漏光问题基本解决

稀疏覆盖与存储(Sparse Coverage)

存储结构

  • 世界空间辐射度缓存是 稀疏的,只在会被屏幕空间探针实际使用的位置放置探针
  • 存储方式:3D Clip Map 网格,以相机为中心
    • Clip Map 只存储指向 探针图集(Probe Atlas)间接索引(Indirection)
    • Clip Map 的分布保证了 有界的屏幕空间大小——既不会放置过多也不会过少的世界空间探针
  • 八面体探针图集(Octahedral Probe Atlas) 存储:
    • 辐射度(Radiance)
    • 追踪距离(Trace Distance)
  • 由于世界空间探针数量 远少于 屏幕探针,每个探针可以分配 更高的分辨率

放置与缓存策略(Placement and Caching)

基本流程

  1. 在 Clip Map 间接索引中 标记(Mark) 后续插值需要用到的位置
  2. 对每个被标记位置(即世界空间探针):
    • 优先复用上一帧的追踪结果(Cache Hit)
    • 若无法复用(Cache Miss) → 在图集中分配新位置 并追踪新光线
  3. 对复用的追踪结果,部分重新追踪(Retrace Subset) 以传播光照变化

高度可变的开销问题

  • 当相机 快速移动转过拐角 暴露大量未缓存区域时,光线追踪量激增 → 卡顿(Hitch)

固定预算方案

  • 设定 全分辨率追踪的固定预算上限
  • 超出预算的 Cache Miss 追踪 → 仍然执行,但降低到 更低分辨率
  • 超出预算的光照更新追踪 → 直接 跳过,等预算恢复后再处理
  • 结果:有界的最大开销,确保实时性能

世界空间探针的重要性采样

与屏幕探针的区别

  • 没有 上一帧入射光照的良好估计(不像屏幕探针可以重投影)
  • 仍然可以按 BRDF 做重要性采样
    • 从屏幕探针 累积 BRDF 信息到世界空间探针

追踪瓦片(Trace Tiles)

  • 由于世界空间探针分辨率更高,无法对单独光线排序
  • 改为按 追踪瓦片(Trace Tiles) 为单位操作
  • 瓦片的分辨率 正比于 BRDF(再次运用 结构化重要性采样
  • 仅对 靠近相机 的瓦片做 超采样(Super Sampling)
    • 超采样后每个世界空间探针可达到约 4000 次追踪
    • 相比屏幕空间降噪器的 1 ray/pixel,这提供了 极其稳定的远距离光照

探针间的空间滤波(Spatial Filtering Between Probes)

挑战

  • 与屏幕空间探针不同,世界空间探针之间 不能假设互相可见(Mutual Visibility)
  • 邻居探针可能被放在 墙的另一侧

理想方案 vs 实际方案

  • 理想方案:通过当前探针存储的深度信息,重新追踪邻居光线路径 → 开销太高
  • 实际方案:仅做 单次遮挡测试(Single Occlusion Test)
    • 测试位置:邻居光线路径上的某个点
    • 几乎零额外开销:直接复用追踪时已捕获的 探针深度信息(Probe Depths),无需追踪新光线
    • 有效减少漏光,同时实现空间复用

世界空间辐射度缓存的综合价值

用途说明
远距离光照屏幕空间缓存前2米 + 世界空间缓存处理更远区域
时间稳定性最大收益——世界空间放置带来稳定误差,大幅改善时间闪烁
指导屏幕探针重要性采样作为入射光照的估计来源(重投影失败时的回退方案)
头发与前向着色为无法使用延迟管线 G-Buffer 的材质提供间接光照
多次弹射(Multi-Bounce)提升多次弹射算法的质量

过渡到全分辨率步骤

  • 至此,入射辐射度 已在低分辨率的屏幕空间辐射度缓存中计算完毕
  • 接下来需要在 全分辨率 下进行:
    • 弯曲法线插值(Bent Normal Interpolation)
    • 积分(Integration)——将低分辨率入射辐射度与全分辨率 BRDF/法线结合
    • 时间滤波(Temporal Filter)
  • 目的:恢复 全分辨率的几何细节,让间接光照具有丰富的空间变化

蒙特卡洛积分降噪、接触阴影恢复、时间滤波与性能


蒙特卡洛积分噪声问题

朴素方法及其问题

  • 最直接的做法:对 BRDF 做重要性采样 获取方向,然后从 八面体辐射度图集(Octahedral Atlas) 中采样获取辐射度
  • 问题:这些采样是 非相干读取(Incoherent Fetches),无法承受太多采样 → 积分中存在 明显噪声

Filtered Importance Sampling 的缺陷

  • 一种改进思路:使用辐射度缓存的 Mip Map 进行 滤波重要性采样(Filtered Importance Sampling)
  • 问题:Mip Map 滤波会将 半球背面的光照拉到前半球,造成 自照明伪影(Self Lighting)

Lumen 的方案:球谐函数(Spherical Harmonics)

漫反射积分

  • 将八面体探针的辐射度转换为 三阶球谐函数(3rd Order Spherical Harmonics, SH) 表示
  • 转换在 辐射度缓存的较低分辨率 下完成
  • 全分辨率像素只需 加载 SH 系数(这是 相干读取(Coherent Load),非常高效)
  • 然后执行 SH 漫反射积分,计算开销极低且质量很高

粗糙镜面反射复用

  • 光线追踪反射在 高粗糙度(High Roughness) 下非常昂贵(需要追踪大量额外光线)
  • 观察:GGX 波瓣在高粗糙度时趋近于漫反射分布,变得非常宽
  • 解决方案:对高粗糙度材质,不再追踪额外光线,而是 复用屏幕空间辐射度缓存
    • 根据 GGX 波瓣做重要性采样 生成方向
    • 直接从屏幕空间辐射度缓存中 采样,而非追踪新光线
    • 自动继承了缓存中已有的所有 采样与滤波工作

接触阴影恢复(Contact Shadows)

问题:降采样追踪丢失接触阴影

  • 由于光线追踪在 降采样分辨率 下执行,接触阴影(Contact Shadows) 丢失
  • 小物体在地面上看起来像是"浮空"的,缺乏近距离遮蔽感

解决方案:全分辨率弯曲法线(Full Resolution Bent Normal)

  • 弯曲法线(Bent Normal) 本质上是一种 方向性遮蔽(Directional Occlusion)
  • 使用 快速屏幕空间追踪(Fast Screen Traces) 计算弯曲法线
    • 追踪距离与 屏幕探针之间的间距 绑定(即只覆盖近距离)

与辐射度缓存的集成

  • 采用 Horizon-Based Indirect Lighting(HBIL) 论文中的启发式方法:
    • 屏幕探针 GI 视为 远场辐照度(Far-Field Irradiance)
    • 弯曲法线代表 近场辐照度(Near-Field Irradiance) 的遮蔽量
    • 论文中的 多次反弹近似(Multi-Bounce Approximation) 提供近场辐照度估计
  • 效果:接触阴影恢复,小物体重新"扎根"于地面,全分辨率几何细节回归

时间滤波(Temporal Filter)

基本策略

  • 由于探针并非放置在每个屏幕像素上,探针位置的 抖动(Jitter) 需要可靠的时间滤波来隐藏
  • 使用 深度拒绝(Depth Rejection) 而非 邻域钳制(Neighborhood Clamp)
    • 深度拒绝的结果 更稳定
    • 但对光照变化的 响应速度慢 → 移动物体后方出现 拖影(Streaking)

快速运动物体的处理

追踪命中速度(Track Hit Velocity)

  • 在光线追踪时,除了记录 命中深度 外,同时记录 命中物体的速度
  • 据此计算每个探针中 属于快速运动物体的投影面积

快速更新模式(Fast Update Mode)

  • 当某个探针的追踪结果 大部分命中快速运动物体 时:
    • 降低时间滤波强度(减少拖影)
    • 提高空间滤波强度(补偿时间滤波减弱带来的噪声)
  • 只对受运动物体影响的像素切换模式,其余像素保持稳定的深度拒绝策略

性能数据与质量缩放

目标平台性能(PlayStation 5)

配置光线预算Final Gather 总耗时内部分辨率
标准质量0.5 ray/pixel3.7 ms1080p(TSR 输出 4K)
低质量0.125 ray/pixel2.1 ms1080p
  • 标准质量下,约 一半开销 来自光线追踪,另一半来自探针放置、插值和积分

质量缩放策略(Scaling Down)

  • 降低辐射度缓存分辨率
  • 禁用弯曲法线(Bent Normal)
  • 从 0.5 ray/pixel 降到 0.125 ray/pixel:
    • 最大的质量差异是 丢失接触阴影(因为禁用了弯曲法线)
    • 时间稳定性略有下降
    • 但整体质量缩放 非常有效

质量向上扩展

  • 在高端 PC 上可提升到 2 rays/pixel
  • 此时获得 极高质量的实时全局光照,即使在复杂室内场景中表现也非常出色

Lumen 系统集成

Final Gather 覆盖的功能

  • 提供 Unreal Engine 5 中 Lumen 的完整 Final Gather,解决:
    • 动态全局光照(Dynamic GI)
    • 带阴影的天光照明(Shadowed Skylighting)
    • 自发光网格的光照贡献(Emissive Mesh Lighting)
    • 粗糙镜面反射(Rough Specular)——与 Lumen 的光线追踪反射系统集成,覆盖 全粗糙度范围

Final Gather 未覆盖的部分

  • 半透明材质的间接光照体积雾(Volumetric Fog)另一套独立技术 处理

支持混合追踪(Hybrid Tracing)

  • Final Gather 与光线追踪方式 完全解耦
  • 支持 Lumen 的多种追踪模式:
    • 软件光线追踪(通过 稀疏符号距离场 Sparse Signed Distance Fields
    • 硬件光线追踪(通过 GPU RT 硬件单元)
  • 同一套 Final Gather 管线,无论底层追踪方式如何,完全通用

未来工作方向

方向说明
改善去遮蔽区域质量当新区域暴露时(如相机转向),减少瑕疵
提升高动态场景的时间稳定性在降低时间滤波 + 提升空间滤波的区域改善质量
将屏幕空间辐射度缓存应用于表面缓存提升 多次反弹 GI(Multi-Bounce GI) 的质量