Radiance Caching for Real-Time Global Illumination SIGGRAPH 2021

Lumen GI 讲座笔记: 问题定义与核心挑战

一、 讲座概述与目标

本讲座将深入探讨 Radiance Caching(辐射度缓存) 技术在 实时全局光照(Real-Time Global Illumination) 中的应用。讲座内容将完整呈现一套 Final Gather 解决方案,该方案是 Unreal Engine 5 中名为 Lumen 的动态全局光照系统的核心。

  • 核心技术: Radiance Caching for Final Gather
  • 应用背景: Lumen - UE5 的动态全局光照与反射系统。
  • 目标平台: 面向次世代主机游戏,并能向上扩展至企业级应用的高质量渲染。

二、 理论基础:渲染方程

实时全局光照的根本目标,是在屏幕的每一个像素上求解 渲染方程(The Rendering Equation)

  • 核心思想: 某个点最终呈现出的光照,是其半球面上所有方向射入的光线(Incoming Radiance)与该点材质表面属性(BRDF)相互作用后的总和。

  • 数学表达:

    其中:

    • 是出射辐射度(最终像素颜色)。
    • 代表在半球面上进行积分。
    • 是双向反射分布函数(BRDF),描述了材质特性。
    • 是从 方向入射的辐射度。
    • 是入射光与法线的夹角余弦。

三、 技术选型:蒙特卡洛光线追踪

为了在实时环境中求解复杂的积分,Lumen 采用了 蒙特卡洛积分(Monte Carlo Integration) 的思想,通过离散采样来近似求解。

  • 核心方法: 使用 光线追踪(Ray Tracing) 向场景中发射光线,以采样获得特定方向的入射光

四、 核心挑战:巨大的性能与质量鸿沟

实时光线追踪面临的最大挑战是其高昂的计算成本,这与实现高质量GI所需的大量采样之间存在巨大矛盾。

1. 光线追踪的性能瓶颈

  • 非相干的内存访问(Incoherent Memory Access): 光线在场景中传播的路径是随机的,导致对场景结构(如 BVH)的遍历是高度非相干的树状遍历,无法有效利用GPU缓存。
  • 实例重叠(Instance Overlap): 在两层BVH(Two-Level BVH)结构中,当多个物体实例(Instance)在空间中重叠时,光线需要对重叠部分进行重复的遍历计算,造成性能浪费。

2. 性能预算 vs 质量要求

  • 性能预算 (Performance Budget): 在实时渲染帧率下,平均每个像素仅能负担约 0.5 条光线 的追踪开销。
  • 质量要求 (Quality Requirement):
    • 室外场景: 至少需要 100 条光线/像素 才能获得较好的间接光照效果。
    • 室内场景: 由于光线会进行多次反弹且遮挡复杂,需要的采样数量远超室外场景

3. 结论:主要矛盾与攻坚方向

  • 核心矛盾: 0.5 Rays/Pixel 的性能预算与 100+ Rays/Pixel 的质量要求之间存在超过两个数量级的巨大差距。
  • 攻坚方向: 室内场景是实时全局光照中最具挑战性的难题,因此是本次技术分享和研发的焦点。

先前方法的局限性:迈向实时全局光照的挑战

核心挑战:性能与质量的巨大鸿沟

要实现高质量的全局光照,通常需要每像素数百条光线(Rays per pixel, RPP)进行路径追踪。然而,在实时渲染的严苛性能预算下(例如,每像素仅能负担0.5条光线),我们必须寻找高效的近似方法。以下是业界在解决此问题时主要采用的两种传统技术路线及其固有的局限性。

技术路线一:辐照场(Irradiance Fields)

这种方法的核心思想是通过在场景中预先放置一些“传感器”(探针),来捕捉和存储光照信息,然后在渲染时进行查询和插值。

  • 核心观点: 通过在世界空间中的稀疏探针点上预计算光照,并为最终像素进行插值,来近似全局光照。

  • 工作流程:

    1. 世界空间中布置稀疏的 探针网格 (Probe Grids)
    2. 预计算 (Pre-calculate) 这些探针位置的 辐照度 (Irradiance)
    3. 渲染时,屏幕上的像素从其周围的探针 插值 (Interpolate) 获取间接光照信息。
  • 主要缺陷:

    • 漏光 (Leaking) 与过度遮蔽 (Over-occlusion): 由于探针是离散且稀疏的,一个被照亮的探针可能会把光“泄漏”到墙壁另一侧的黑暗区域。反之,一个被遮挡的探针也可能错误地使周围本应被照亮的区域变暗。虽然一些实现加入了 探针遮蔽 (Probe Occlusion) 来缓解,但问题依然普遍存在。
    • 探针布局困难 (Difficult Probe Placement): 最终光照质量极度依赖于探针的摆放位置。在复杂场景中,手动或自动地找到最优的探针布局是一项艰巨的任务。
    • 更新缓慢 (Slow Update): 辐照场的更新成本很高,导致它难以应对动态光照和动态场景。很多实现采用非常缓慢的更新策略来隐藏瑕疵,但这牺牲了实时性。
    • “扁平”的视觉外观 (Flat Look): 由于光照信息是从低空间分辨率的探针网格中插值而来,最终结果往往缺乏高频细节,呈现出一种独特的、不自然的“扁平”感。

技术路线二:屏幕空间降噪(Screen Space Denoisers)

这种方法直接从像素出发追踪少量光线,然后依赖强大的图像后处理技术来“猜”出干净的结果。

  • 核心观点: 以极低的采样率(例如1 RPP)追踪光线,然后利用屏幕空间的降噪器,通过时域与空域的信息复用,来消除噪声。

  • 工作流程:

    1. 从屏幕上的每个像素出发,追踪极少数(通常是 1条)光线来计算GI。
    2. 得到一张充满噪点的原始图像。
    3. 使用一个复杂的屏幕空间降噪器,利用 空域(Spatial,像素邻域)和时域(Temporal,前几帧)的信息复用 技术,对噪声图像进行重建。
  • 主要缺陷:

    • 输入信号噪声过高 (Input is too noisy): 这是该方法最根本的瓶颈。在许多具有挑战性的室内场景中,仅用1 RPP得到的结果噪声过高,已经超出了降噪器能够有效处理的范围,导致降噪失败,出现严重的图像瑕疵。
    • 采样策略过于简单 (Oversimplified Sampling Strategy):
      • 固定的余弦分布: 光线通常仅基于一个简单的 余弦分布 (Cosine Distribution) 进行追踪,没有利用场景中的光源位置等重要信息进行智能采样(即重要性采样)。
      • 固定的采样率 (Fixed Sample Rate): 算法对屏幕上的所有像素都使用相同的采样率。这非常低效,因为场景中不同区域的GI计算难度不同。例如,靠近明亮光源的区域(噪声低)和远离光源的黑暗角落(噪声高)使用了相同的采样率,造成了性能浪费或质量不足。

高级降噪技术——从屏幕空间到辐射缓存

1. 传统屏幕空间降噪器(Screen Space Denoiser)的局限性

传统的屏幕空间降噪方法在处理光线追踪产生的噪声时,存在一些固有的问题,尤其是在光照变化剧烈的场景中。

  • 核心观点: 屏幕空间降噪是一种后处理技术,它在采样完成后介入。它无法从根本上改善采样质量,只能通过模糊(滤波)来掩盖噪声,这往往以牺牲图像细节为代价。

  • 关键问题点:

    • 非均匀噪声(Non-Uniform Noise): 噪声在屏幕空间上的分布是不均匀的。在靠近明亮光源的区域,光线更容易击中光源,因此噪声较少;而在远离光源的区域或被遮挡的区域,光线击中光源的概率急剧下降,导致噪声显著增加。
    • 被动式处理: 降噪器只能通过增加滤波强度来应对更强的噪声。这种“一刀切”的模糊会破坏高频细节,导致画面质量下降,尤其是在材质和几何细节丰富的区域。
    • 信息缺失: 由于降噪发生在采样之后,它无法弥补采样阶段丢失的光照信息。如果一个区域因为采样不足而完全是黑的,降噪器也无能为力。

2. 新方案:屏幕空间辐射缓存(Screen Space Radiance Caching)

为了从根源上解决问题,讲座提出了一种基于辐射缓存思想的全新架构,其核心是从“被动降噪”转向“主动提升采样质量”。

  • 核心观点: 与其在全屏幕上进行低效的、逐像素的追踪,不如在稀疏的像素集合上集中资源进行高质量的追踪,然后利用光照的连续性来重建最终图像。这本质上是一种对 输入光照(Incoming Radiance)的降采样

  • 关键技术与优势:

    • 屏幕空间辐射缓存(Screen Space Radiance Caching):

      • 机制: 不再为每个像素追踪光线,而是将光线捆绑起来(bundle up),从一个更小的、稀疏的像素集合(即“探针”或“缓存点”)出发进行追踪。
      • 理论基础: 这种方法之所以有效,是因为 输入光照通常是相干的(Coherent)。即使场景的几何体和法线是高频、不连续的,但来自间接光照和区域光的光照信息通常是平滑变化的(低频)。因此,可以在低分辨率下对光照进行采样。
    • 全分辨率整合(Full-Resolution Integration):

      • 机制: 虽然光照信息是在低分辨率下(通过稀疏探针)获取的,但在最终着色阶段,会将这些光照信息与 全分辨率的G-Buffer信息(如BRDF、法线、几何体) 进行整合。
      • 优势: 既享受了稀疏采样带来的性能提升,又保留了全分辨率的几何和材质细节,避免了光照出现块状瑕疵。
    • 探针空间滤波(Filtering in Probe Space):

      • 机制: 滤波操作不再是在最终图像的屏幕空间进行,而是在辐射缓存的探针之间进行插值和滤波。
      • 优势: 这种方式更符合光照在三维空间中的分布规律,可以实现更稳定、更自然的滤波效果,避免屏幕空间滤波常见的物体边缘漏光等问题。
    • 主动优化采样(Proactive Sampling Optimization):

      • 重要性采样(Importance Sampling): 系统会预先估计主要光照可能来自哪些方向,然后有偏向性地在这些方向上发射更多的光线。这极大地提高了光线击中光源的效率,从源头上减少了噪声。
      • 分离式采样方案(Separate Sampling Scheme): 针对远景光照(如太阳、天空光),采用独立的 世界空间辐射缓存(World Space Radiance Cache) 来处理。这为远景光照提供了稳定且高效的解决方案,避免了与场景内局部光照采样策略的冲突。

3. 性能与效果对比

讲座通过一个直观的对比,展示了新旧两种方法的输入差异:

  • 屏幕空间降噪器: 使用 2 spp (samples per pixel),输入图像已经充满大量噪声。
  • 屏幕空间辐射缓存: 仅使用 0.5 spp (平均每个像素半条光线),其追踪结果在降噪前就已经比前者干净得多。

这证明了新方案通过更智能的采样策略, 即使在光线预算降低4倍的情况下,也能获得质量更高的初始采样结果,为后续处理和最终图像质量奠定了坚实的基础。

最终聚集(Final Gather)管线与屏幕空间辐射缓存

本节内容深入探讨了用于实现最终聚集(Final Gather)效果的高效管线,其核心是结合了屏幕空间和世界空间的混合辐射缓存(Radiance Cache)系统。

1. 最终聚集(Final Gather)管线概述

与直接在全分辨率屏幕上进行大量光线追踪不同,这种方法采用了一种多层级、多分辨率的缓存策略来优化性能。

  • 核心思想: 使用一个层级化的缓存系统来存储和复用光线追踪的结果,避免在每个像素上都进行昂贵的计算。
  • 管线构成:
    1. 屏幕空间辐射缓存 (Screen Space Radiance Cache): 这是管线的核心,在低于最终图像分辨率的尺度上工作。它是主要的辐射信息来源。
    2. 世界空间辐射缓存 (World Space Radiance Cache): 作为屏幕空间缓存的备用或补充,它在更低的分辨率下运行,用于处理屏幕空间信息不足的情况。
    3. 全分辨率处理: 最后的 插值(Interpolation)积分(Integration) 以及 时间域滤波(Temporal Filter) 步骤都在全分辨率下执行,以确保最终图像的质量。

2. 屏幕空间辐射缓存(Screen Space Radiance Cache)详解

这是实现高质量、高性能间接光照的关键。其设计和实现包含两个主要方面:探针的数据结构和探针的放置策略。

2.1 探针(Probe)的数据结构与光线追踪

为了高效管理和查询成千上万个探针的数据,系统采用了以下设计:

  • 数据组织: 将所有屏幕空间探针(Screen Probes)的数据打包到一个 纹理图集(Atlas) 中进行统一管理和GPU采样。
  • 探针展开方式: 每个探针使用 八面体布局(Octahedral Layout) 来展开其接收到的环境光信息。
    • 优点: 这种布局能够提供在世界空间中均匀分布的采样方向,避免了传统CubeMap在角落处的畸变和采样密度不均问题。
    • 实现细节: 通常每个探针的分辨率为 8x8,意味着每个探针会发出 64 条追踪光线(Traces)
  • 关键设计 - 世界空间方向:
    • 核心: 探针的采样方向(即光线方向)被定义和存储在 世界空间(World Space) 中,而不是探针的局部空间。
    • 原因: 这确保了 物理上相邻的探针,其对应索引的采样方向是完全一致的。这个特性对于后续在探针之间进行数据插值或快速查找匹配方向至关重要。
  • 存储数据: 对于每条追踪光线,图集中会存储两个关键信息:
    • 辐射度(Radiance): 光线最终命中点所贡献的光照颜色和强度。
    • 命中距离(Hit Distance): 光线从探针原点到命中点之间的距离。
2.2 探针的放置策略(Probe Placement)

为了在节约计算资源的同时最大化信息覆盖率,探针的放置采用了一种 自适应的、由粗到精(Coarse-to-Fine) 的多层级策略。

  • 核心思想: 不在屏幕上均匀地放置探针,而是 只在需要高频细节或现有探针无法准确表达光照信息的区域,才加密放置新的探针
  • 执行流程:
    1. 初始阶段 (Coarse Pass): 在一个低分辨率的屏幕网格上(例如 每 16x16 像素)放置第一批基础探针。
    2. 评估阶段 (Evaluation): 对于屏幕上的所有像素,尝试使用周围已存在的探针数据进行插值,计算出该像素的光照。记录下那些 插值失败(Interpolation Failed) 的区域。插值失败通常发生在几何不连续(如物体的边缘)或光照剧烈变化的区域。
    3. 加密阶段 (Refinement Pass): 将放置探针的网格分辨率加倍(例如变成 8x8 像素 的网格)。
    4. 自适应放置: 只在新网格点中,且该位置在前一阶段被标记为“插值失败”的区域,才放置一个新的探针
    5. 迭代: 这个“评估-加密”的过程可以重复进行,直到达到预设的探针数量预算或渲染质量要求。

自适应探针放置与插值

一、自适应探针放置策略 (Adaptive Probe Placement)

本节讲述了一种高效的、根据需求动态放置光照探针的算法,其核心思想是在“需要的地方”才进行更精细的计算。

  • 核心观点: 系统首先基于现有的探针进行插值计算,当发现某些像素的插值结果失败或质量很差时,就在这些失败的位置补充新的探针。这个过程会持续进行,直到大部分像素的插值都成功为止。

  • 关键术语:

    • 自适应采样 (Adaptive Sampling): 这就是上述算法的名称。它不是均匀地、暴力地放置探针,而是根据上一轮的渲染结果,有针对性地增加采样点(探针),从而将计算资源集中在最需要的地方。
    • 插值失败 (Interpolation Failed): 判断是否需要新增探针的核心触发条件。这通常意味着当前像素周围的探针数据差异过大,或者距离太远,无法提供一个可靠的光照估计。
  • 性能优化与权衡:

    • 终止条件: 为了避免无限递归下去,当只有极少数像素插值失败时,算法会停止新增探针。
    • 最终填充方案: 对于最后剩下的极少数“顽固”像素,系统会使用 泛光填充 (Flood Fill) 的方式来快速补全,而不是为单个像素放置一个昂贵的探针(例如,一个探针可能需要64条光线追踪)。这是一种典型的性能与质量的权衡。

二、实时性考量与实现细节

为了在实时渲染中应用自适应采样,必须对其进行严格的预算控制和高效的资源管理。

  • 核心观点: 必须为自适应探针的数量设置一个上限,以保证稳定的帧率。所有探针(无论是预先放置的还是自适应增加的)都应该被统一管理和处理,以最大化硬件利用率。
  • 实现细节:
    • 探针预算 (Probe Budget): 强制设定一个探针总数的 上限 (upper limit)
    • 统一处理 (Unified Processing): 自适应探针被放置在一个专门的纹理 图集 (Atlas)底部,这样可以和其它探针一起进行批处理,提高效率。
    • 超出预算的处理: 当图集空间被用尽时,即使仍有像素插值失败,系统也会停止放置新探针,转而完全依赖泛光填充来处理剩余区域。
    • 避免采样瑕疵: 由于探针是稀疏放置的(例如每N个像素才放一个),为了避免出现规律性的摩尔纹或条带,系统会对探针的 放置网格 (placement grid) 和光追方向进行 抖动 (Jittering) 处理。

三、屏幕空间插值与泄漏问题处理

当探针数据准备好后,如何将其正确地应用(插值)到屏幕上的每一个像素是最后一步,也是至关重要的一步。

  • 核心观点: 为了精确地将光照应用到像素上并防止瑕疵,探针被直接放置在屏幕像素位置。插值时,使用一种基于“平面距离”的权重方案来防止前景光照错误地影响背景。

  • 屏幕探针 (Screen Probes):

    • 精确放置: 探针被直接放置在屏幕像素上,确保探针与像素之间没有空隙,从而避免光照泄漏。
    • 引入的问题: 这种做法会导致一个新问题——在单个像素或其邻域(Screen Cell)内部,探针无法捕捉到微小的遮挡关系变化。
    • 解决方案: 使用 时间性滤波器 (Temporal Filter) 来平滑和隐藏这些微小的遮挡差异,通过多帧信息来弥补单帧信息的不足。
  • 插值权重方案 (Interpolation Weighting):

    • 权重计算: 在为某个像素计算光照时,周围探针的贡献度(权重)取决于该探针到“像素平面”的距离。这个“像素平面”是由像素自身的位置(Position)和法线(Normal)共同定义的。 Weight ∝ 1 / Distance(ProbePosition, PixelPlane)
    • 核心目的: 这种权重方案非常关键,其主要目的是防止前景的探针光照泄漏到背景上。例如,一个靠近玩家角色的探针,不应该对角色背后很远的墙壁产生影响。基于平面距离的判断能有效地处理这种几何不连续的情况。
    • 插值抖动 (Interpolation Jitter): 在插值采样时也引入了抖动,以打散可能出现的条带状瑕疵。但这个抖动有一个重要限制:抖动后的采样位置必须依然位于原始像素所在的平面上,以维持上述防泄漏机制的有效性。

Jitter 的关键特性

  • 共面抖动 (Coplanar Jitter): 施加在像素上的抖动位置,始终与原始像素位于同一平面上
  • 核心优势: 这种约束至关重要,因为它确保了抖动本身不会破坏后续的插值计算(例如,双线性插值)。
  • 主要作用:
    1. 空间上分布光照差异: Jitter 有效地将相邻探针 (Probe) 之间的光照差异在空间上打散,避免出现明显的块状或接缝瑕疵。
    2. 辅助 TAA 稳定: 它通过 扩大时间抗锯齿 (Temporal Anti-Aliasing, TAA) 的邻域钳制 (neighborhood clamp) 范围,帮助稳定最终的光照结果,减少闪烁。

性能、噪点与重要性采样

理想与现实:性能预算下的噪点问题

  • 正确性验证: 当我们不考虑性能限制,将光线数量和空间分辨率调得很高时,当前这套 Screen-Space Radiance Cache 管线输出的结果可以 与 Path Tracer (路径追踪) 的结果高度匹配。这证明了算法实现是正确的。
  • 性能瓶颈: 然而,在实际的游戏性能预算下,例如严格限制在 每像素半条光线 (0.5 ray/pixel) 时,渲染结果会产生极其严重的噪点,尤其是在室内场景中。

核心观点: 我们的渲染管线在理论上是正确的,但要在严格的性能预算内达到可接受的图像质量,就必须引入高效的降噪技术。

重要性采样 (Importance Sampling)

为了在不增加光线预算的前提下降低噪点,我们引入的第一个关键技术是重要性采样。

核心思想:向“重要”的方向投射光线

回顾蒙特卡洛积分的渲染方程:

理想情况下,我们应该根据被积函数 的分布来投射采样光线 (),即 在贡献大的方向(比如光源方向)上投射更多的光线

  • 关键难题 (The Chicken-and-Egg Problem): 被积函数中包含了我们正在求解的入射光照 。我们无法在求解 之前,就预知 的分布。

实现方案:利用上一帧的光照缓存 (Temporal Reuse)

讲座提出了一种非常巧妙的解决方案:用上一帧的 Screen-Space Radiance Cache 来近似估算当前帧的入射光照 分布

  • 核心观点: 游戏渲染中,相邻两帧的画面具有极高的相似性。因此,上一帧的完整光照信息,是当前帧一个极佳且廉价的预测器

  • 具体步骤:

    1. 获取当前像素在屏幕上的位置。
    2. 通过 Reprojection (重投影),将当前像素的位置变换到上一帧的屏幕空间中。
    3. 在上一帧的 Radiance Cache 中,查找重投影位置周围的 四个相邻探针 (neighboring screen probes)
    4. 将这四个探针记录的光照信息进行平均,以此作为当前像素入射光照分布的 概率密度函数 (PDF),来指导本帧光线的投射方向。
  • 性能优势: 这个查找过程非常高效。因为 Radiance Cache 已经按位置和方向进行了索引,所以我们无需在屏幕空间进行昂贵的搜索,只需一次 Reprojection 和一次简单的邻域访存即可。

挑战:Reprojection 失败的情况

这种时间复用的方法并非万无一失。在以下情况下,Reprojection 会失败:

  • 物体在上一帧位于屏幕外
  • 物体在上一帧被其他物体遮挡

当 Reprojection 失败时,我们就无法获取上一帧的光照信息,需要回退到其他采样策略。

Screen Probes的高级优化:重要性采样技术

本节聚焦于如何提升Screen Probe的光线追踪效率和质量,核心思想是放弃均匀采样,转而采用一种更智能的重要性采样方法,将计算资源集中在对最终结果贡献最大的光线方向上。

一、 Screen Probe 数据来源与整合

为了进行有效的采样,Probe需要整合两个关键信息:入射光(Lighting)和表面材质(BRDF)。

  • 光照数据 (Lighting Data - Li)

    • 核心来源: 主要通过上一帧的 重投影 (Reprojection) 获取。
    • 容错机制 (Fallback): 当重投影失败时(例如,上一帧位置在屏幕外或被遮挡),系统会回退到使用一个更稳定但可能精度较低的 世界空间辐射度缓存 (world space radiance cache)
    • 数据结构: 入射光信息被存储在一种 八面体布局 (octahedral layout) 的纹理中,这是一种将球面方向高效映射到2D纹理的常用技术。
  • 材质数据 (BRDF Data)

    • 核心来源: 从 G-Buffer 中获取。
    • 整合方式: Probe会 累加 (accumulate) 所有将使用该探针进行光照计算的像素的BRDF信息,形成一个代表该区域平均材质响应的聚合BRDF。

二、 采样优化的动机

传统的均匀采样(或仅针对Li或BRDF进行重要性采样)存在明显效率问题。

  • 核心痛点: 以一个放置在平面墙壁上的Probe为例,如果采用均匀方向采样,大约一半的光线会射入墙体内部。在这些方向上, BRDF值为零,导致这些光线追踪和着色的计算被完全浪费。
  • 理想目标: 最理想的采样策略不是单独考虑光照或BRDF,而是 对两者的乘积(Lighting * BRDF)进行重要性采样。这样可以确保光线被投射到那些既有较强入射光、又有较高材质反射率的方向,实现效率最大化。

三、 结构化重要性采样 (Structured Importance Sampling - SIS)

为了实现对 Lighting * BRDF 乘积的有效采样,讲座介绍了一种名为 结构化重要性采样 的技术及其在实时渲染中的变体。

  • 核心思想:

    • 这是一种将少量样本分配到 概率密度函数 (PDF) 的分层结构区域 中的方法。
    • 它旨在实现优秀的 全局分层 (global stratification),即在重点区域密集采样的同时,也能以稀疏的方式覆盖整个半球,避免遗漏重要信息。
  • 实时渲染的挑战与解决方案:

    • 挑战: 原始论文中的SIS算法需要 离线处理 (offline processing),不适用于实时游戏渲染。
    • 实时方案: 团队巧妙地借鉴了其核心的 分层阈值化 (hierarchical thresholding) 思想,并发现它能完美地与他们使用的 八面体Mip-Quadtree (octahedral mip quad tree) 数据结构相结合。
  • 具体流程:

    1. 计算PDF: 首先,计算代表采样重要性的概率密度函数(PDF),即 入射光与BRDF的乘积

    2. 构建采样层级: 依据PDF的值, 在PDF值高的区域对八面体布局进行递归细分。高能量(高PDF值)的区域会被划分得更细,从而在后续步骤中被分配更多的采样光线。

    (左图:光照与BRDF的乘积,颜色越亮代表PDF值越高。右图:根据左图的PDF,对八面体布局进行自适应细分,高亮区域被划分得更细)

四、 渲染管线集成 (Integration into the Rendering Pipeline)

将这种复杂的采样策略集成到GPU渲染管线中,需要一个关键的实现技巧。

  • 关键实现: 为光线追踪通道添加间接寻址 (Indirection to tracing lanes)
    • 传统的追踪线程可能会各自生成一个随机/均匀的方向。
    • 在使用SIS后,系统会先根据上述方法生成一个“最佳”采样方向列表。
    • 每个 追踪线程 (tracing thread) 不再自己决定方向,而是通过这个间接层,被分配一个预先计算好的、更具重要性的方向去进行追踪。
    • 这样,整个光线追踪过程就被引导到了对最终画面贡献最大的方向上,从而在不增加光线总数的情况下,显著提升了渲染质量和性能。

Structured Importance Sampling for Ray Generation

一、核心思想与流程概述

本节重点介绍一种用于光线追踪的优化技术: 结构化重要性采样 (Structured Importance Sampling)。其核心目标是 将计算资源(光线)集中投射到对最终着色结果贡献最大的方向上,从而在相同的光线数量下,显著减少噪声,提升渲染效率和质量。

  • 最终合成步骤: 在完成光线追踪并计算出 辐照度 (Radiance) 后,需要将从 非均匀光线布局 (non-uniform layout) 中得到的结果,重新组合(Composite)回 均匀探针布局 (uniform probe layout) 中,以便进行最终的积分和着色。

二、光线生成算法详解 (Compute Shader 实现)

这套算法通过动态地重新分配光线方向,实现了重要性采样。

1. 核心步骤

  1. 计算概率密度函数 (PDF): 对于每一个 八面体纹理像素 (Octahedral Texel),计算其对应方向的 PDF。这个PDF正比于 BRDF入射光照 (Lighting) 的乘积。这是重要性采样的核心依据,因为它代表了该方向对最终颜色的贡献潜力。

    关键公式:

    其中, 是入射光方向, 是出射(观察)方向, 是入射光。

  2. 初始化均匀光线: 算法开始时,先生成一组 均匀分布的初始光线方向。这一步的目的是确保在追踪开始时,GPU 的每个线程和线程组都有工作可做,避免硬件空闲和负载不均

  3. 排序与筛选: 根据上一步计算出的 PDF 值,对所有光线进行排序。

  4. 光线剔除与重定向 (Culling & Reassignment):

    • 设定一个 剔除阈值 (Cull Threshold)
    • 遍历排序后的光线,将 PDF 值低于阈值的“低重要性”光线剔除
    • 将被剔除光线的计算资源,重新分配给 PDF 值最高的“高重要性”方向,对这些方向进行 超采样 (Supersample)。例如,每剔除 N 条低重要性光线,就在一条高重要性光线附近增加 N 条新的采样光线。

2. 效果对比

  • 传统均匀采样: 大量光线被浪费在不会对结果产生贡献的方向上。例如,光线刚射出就打到旁边的墙壁,其贡献为零,但计算成本却已付出。
  • 结构化重要性采样: 光线被智能地重新导向到光源方向或其他 BRDF 波瓣 所指向的关键方向。这使得在相同的光线预算下,能够更精确地捕捉光照信息,显著降低渲染结果中的噪点

三、算法的改进与优化

初始算法虽然有效,但存在一个可以改进的关键点。

  • 原始策略: 剔除 光照 PDF (Lighting PDF) 较低的光线。
  • 存在的问题: 光照 PDF 仅仅是一个近似值,它可能依赖于前一帧的数据或某种场景结构的简化,因此可能存在噪声或延迟。例如,场景中一个微小但极亮的光源可能在上一个采样周期中被遗漏,导致其 PDF 值过低,从而在本轮被错误地剔除。

改进策略:基于 BRDF 进行剔除

  • 核心变更: 只剔除那些 BRDF 值为零(或极低)方向上的光线,而不是基于光照 PDF。

  • 理论依据:

    • 光照 PDF 的不确定性: 光照环境是动态且复杂的,基于它的预测可能不准。为了不错过任何潜在的光源,即使某个方向的预估光照很弱,也应该至少投射一条光线去“确认”一下。
    • BRDF 的确定性: 对于一个给定的表面材质和观察角度,其 BRDF 是确定且可靠的。如果一个方向的 BRDF 值接近于零,那么根据渲染方程,无论该方向的入射光多强,其对最终着色的贡献都将是零。因此,剔除这些方向的光线是 100% 安全且无损 的。

通过这项改进,算法在保留了对未知光源的探索能力的同时,又能安全地剔除掉那些物理上就不可能产生贡献的光线,从而变得更加鲁棒。

核心技术:基于重要性采样的降噪与空间滤波

通过重要性采样(Importance Sampling)提升射线质量

本节的核心思想是,在固定的射线预算下(例如每像素半条射线),通过 将射线投射到“更聪明”的方向 来显著降低噪声,而不是盲目地增加射线数量。

双重引导(Dual-Guided)的射线方向

为了让射线更有效地捕捉到场景光照,我们使用两种信息来共同“引导”当前帧的采样方向:

  • 时间引导(Temporal Guidance)

    • 核心方法:利用上一帧的光照Last Frame's Lighting)作为当前帧射线方向的概率密度函数(PDF)。简单来说,上一帧中亮的区域,在这一帧有更大概率被采样。
    • 优点:能够将采样预算集中在对最终画面贡献最大的光照方向上。
    • 注意事项:上一帧的光照信息是近似的,可能因为相机或物体移动而过时。因此,它只作为引导,最终的光照贡献计算仍需依赖当前帧的精确数据。
  • BRDF 引导

    • 核心方法:与时间引导不同, BRDF(双向反射分布函数) 来自当前帧的 G-buffer,因此它是完全准确且无噪声的。
    • 结合使用:将上一帧的光照信息与当前帧的 BRDF 相结合,共同决定最佳的采样方向,从而在低射线数量下实现高质量的间接光照。

优化策略:激进的射线剔除与重分配

为了进一步压榨性能,系统采用了一种更激进的射线管理策略。

  • 传统方法:通常只剔除那些 BRDF 贡献为零的射线。
  • 改进方法
    1. 主动剔除低贡献射线:可以剔除那些 BRDF 大于零但贡献很小 的射线。
    2. 权重补偿:在后续的空间滤波阶段,降低这些被剔除方向的权重,以补偿这种激进剔除可能带来的能量损失(例如角落变暗)。
    3. 预算重分配:将这些被剔除的“不重要”射线的计算预算,重新分配给光照贡献更重要的方向

关键数据结构:射线束探针(Ray Bundling into Probes)

将射线打包成 探针(Probes) 是实现上述高效采样的基础。这种结构化方式使得:

  • 能够高效地查询和复用上一帧的光照数据。
  • 为更智能的采样算法提供了便利的数据结构支持。

最终效果:在同样 每像素 0.5 条射线 的预算下,经过重要性采样引导的光线追踪结果,其噪声水平显著低于没有引导的朴素采样。

屏幕空间辐射缓存(Screen Space Radiance Cache)进行空间滤波

本节介绍了一种高效的空间滤波技术,它不是在传统的屏幕空间(Screen Space)进行,而是在一个降采样的缓存空间中完成。

核心观点:在辐射缓存中进行滤波

  • 工作流程:滤波过程直接在 辐射缓存图集(Radiance Cache Atlas) 上进行,即同时从这个图集读取邻域信息并写入滤波后的结果。
  • 巨大优势:由于辐射缓存本身是降采样的,这使得我们可以用极低的成本实现非常大范围的空间滤波
    • 关键数据对比:在探针空间(Probe Space)中进行一次 3x3 的滤波,其覆盖的屏幕区域等效于在全分辨率屏幕空间(Screen Space)进行一次 48x48 的滤波。这带来了巨大的性能提升。

滤波权重算法的优化

在对入射光(Incoming Radiance)进行滤波时,可以做以下关键简化:

  • 忽略法线差异

    • 原理:入射光的方向和强度与接收表面自身的法线无关(法线仅在计算 BRDF 时才起作用)。
    • 实践:在对邻近探针的入射光进行混合时,无需考虑它们表面法线的差异,简化了计算。
  • 仅使用深度加权(Depth Weighting)

    • 目的:为了防止不同深度的物体之间发生漏光(Light Leaking),滤波时只需要根据深度信息对邻域的辐射度进行加权
    • 效果:这可以有效地保留几何边缘,避免背景光错误地影响到前景物体。

这种在降采样空间中、基于简化的权重算法进行滤波的方式,是实现高效、高质量降噪的关键。

辐射缓存的空间滤波与局限性

一、 探针空间(Probe-Space)的空间滤波技术

本节内容聚焦于一种无需追踪额外光线,在探针(或屏幕)空间进行滤波以降噪的技术。其核心思想是复用相邻像素(或探针)的着色结果。

核心观点
  • 直接从相邻像素/探针复用辐射度(Radiance)信息是一种高效的降噪手段,因为它能快速找到与当前采样方向匹配的光照数据。
  • 然而,简单的复用会导致 光照泄漏(Leaking),即本应处于阴影中的表面被邻近的明亮表面的光照信息所污染。
关键技术:带泄漏剔除机制的空间滤波

为了解决光照泄漏问题,讲座提出了一种基于几何信息的启发式(Heuristic)剔除方法。

  1. 基本思路

    • 获取一个邻近像素(Neighbor)的光线追踪命中点(Ray Hit)。
    • 将这个命中点 重投影(Reproject) 到当前像素的观察视角下。
    • 计算“当前像素位置 重投影后的命中点位置”这个方向,与“当前像素正在采样的目标方向”之间的角度差
    • 如果角度差过大,则认为邻近像素的这个光照信息不适用于当前像素,并将其 剔除(Reject)
  2. 初步效果与问题

    • 优点:该方法能有效滤除远处光照引入的噪声,同时保留局部阴影的锐利度。在平坦表面上降噪效果非常出色。
    • 缺点:丢失了 接触阴影(Contact Shadows)。例如,毛巾褶皱之间、毛巾与墙壁之间的精细阴影会消失。
  3. 问题根源分析

    • 该方法的角度误差检查机制偏向于保留远处光照
    • 因为远处的光源几乎没有 视差(Parallax),对于相邻的两个像素来说,采样远处光源的方向几乎完全相同,导致角度差非常小,它们的样本永远不会被剔除。
    • 这使得远处未被遮挡的光照信息“泄漏”到了本应被近处物体遮挡形成接触阴影的区域。
  4. 改进方案:钳位邻近命中距离

    • 核心算法:在进行重投影计算之前,先将邻近像素的光线命中距离 D_neighbor,用当前像素的光线命中距离 D_self 进行 钳位(Clamp)
      D_clamped = min(D_neighbor, D_self)
      
    • 工作原理:这个简单的操作强制邻近像素的贡献被限制在与当前像素相同的深度范围内。如果当前像素看到的是近处物体(D_self很小),而邻居看到了远处的光源(D_neighbor很大),这个钳位操作能有效阻止远处的光照信息影响近处的阴影计算,因为它将邻居的“贡献点”拉回到了当前像素的表面附近,使得几何差异(和角度差异)变得显著。
    • 最终效果:在保留远处光照平滑效果的同时,成功地恢复了精细的接触阴影

世界空间辐射缓存

尽管探针空间滤波技术非常有效,但它并不能解决所有问题。讲座在这里引出了一个新的挑战和对应的解决方案。

核心观点
  • 仅依赖屏幕空间探针进行追踪和滤波,对于 远处光照(Distant Lighting),尤其是那些由 微小而明亮的特征(Small Bright Feature) 产生的光照,仍然会产生大量噪声。
问题根源分析
  • 这是一个经典的蒙特卡洛光线追踪问题: 噪声(或者说方差)与光源距离成正比
  • 一个物体离得越远,它在视野中占据的立体角就越小。如果这个物体同时又非常亮(比如远处的太阳或一盏灯),那么随机发射的光线就很难击中它。
  • 一旦某根光线侥幸击中,它会带回极高的能量值,形成一个明亮的噪点;而大多数光线会错过它,带回0能量。这种巨大的采样结果差异导致了极高的方差,表现为画面上的噪点。
  • 屏幕空间的采样策略在这种情况下效率低下,难以收敛。
引出的解决方案

为了专门解决远处高频光照带来的噪声问题,需要引入一种新的数据结构—— 世界空间辐射缓存(World-Space Radiance Cache)

处理远距离光照:世界空间辐射缓存 (World Space Radiance Cache)

一、 远距离光照 (Distant Lighting) 的挑战

直接对远距离光照进行光线追踪采样会遇到两个核心问题,导致简单增加采样数量(Trace more rays)的暴力方案不可行。

  • 高方差(噪声):远距离的微小高亮光源(a small bright feature)会导致采样结果产生巨大的方差,形成难以收敛的噪点。这种噪声会随着与该光源距离的增加而变得更加严重。
  • 高昂的性能开销:采样远距离光照需要投射 长且不相干的光线(long, incoherent traces)。这种光线在遍历场景结构(如 BVH)时效率极低,导致追踪过程非常缓慢。

二、 核心思路:利用时空缓存

解决这一问题的关键在于利用远距离光照的一个固有特性:

  • 核心观点远距离光照在时间和空间上都变化得非常缓慢
  • 解决方案:这一特性为我们提供了巨大的优化机会。我们可以对远距离光照信息进行 时空缓存(cache across time and space)。这意味着:
    • 可以在 多帧之间复用(reuse across frames) 光照结果。
    • 可以为 邻近的屏幕空间位置复用(reuse for neighboring screen probes) 相同的远距离光照数据。

三、 技术方案:世界空间辐射缓存 (World Space Radiance Cache - WSRC)

为了高效地缓存和查询远距离光照,讲座中提出了一种独立的采样与存储机制,其灵感来源于游戏《明日之子》(The Tomorrow Children) 中使用的技术。

  • 关键术语世界空间辐射缓存(World Space Radiance Cache),简称 WSRC
  • 核心优势:WSRC 的探针(Probes)被放置在 世界空间(World Space) 中。
    • 这使得其产生的 误差是稳定的(Stable Error),不会像屏幕空间技术那样随着摄像机的移动而剧烈变化。
    • 稳定的误差更容易通过其他手段(如插值、时间累积)进行隐藏和管理。

四、 WSRC 在渲染管线中的整合

WSRC 并非一个完全独立的系统,而是作为最终光照采集(Final Gather)管线的一部分,专门为屏幕空间探针提供远距离光照数据。

  • 数据流屏幕空间辐射缓存(Screen Space Radiance Cache) 在计算远距离光照时,会向 WSRC 进行查询。

  • 工作流程

    1. 探针布局 (Placement):在需要进行光照计算的屏幕空间探针(Screen Probes)周围, strategically 地放置一组 世界空间探针(World Space Probes)
    2. 光照计算 (Tracing):从这些世界空间探针的位置发射光线,计算并缓存它们接收到的远距离入射光(Incoming Radiance)。
    3. 数据插值 (Interpolation):当屏幕空间探针需要远距离光照信息时,它会从周围的多个世界空间探针中插值获取缓存好的辐射度数据,作为自己的远距离光照解。

五、 实现细节与关键考量

将屏幕空间探针的光线与世界空间探针的数据连接起来时,需要注意一些关键的实现细节,以确保结果的正确性。

  • 概念模型:可以想象成,屏幕空间探针的一条用于采样远距离光照的光线,在延伸到足够远后,与预先计算好的世界空间探针数据进行了 “连接(Connecting)”

  • 追踪世界空间探针光线的注意事项

    • 起始点偏移 (Offset):在从世界空间探针位置发射光线时,必须为其起始点增加一个偏移量
    • 目的:为了跳过该探针自身的 插值足迹(Interpolation Footprint)。任何位于该“足迹”范围内的点都会使用此探针的数据,因此探针在计算自身光照时,必须确保采样到的是真正的“远距离”信息,而不是其影响范围内的局部几何体信息(Local Lighting)。
  • 追踪屏幕空间探针光线的注意事项

    • 当屏幕空间探针的光线去连接(查询)世界空间探针时,需要确保这条光线的长度(或检测范围)能够覆盖到世界空间探针的插值区域,从而完成数据的“交接”。

整合世界空间辐射缓存与解决光照泄漏

一、 核心问题:屏幕空间与世界空间探针的衔接与光照泄漏

当屏幕空间光线追踪(Ray Tracing)未能命中任何物体而需要从世界空间探针获取信息时,一个关键问题是如何无缝地衔接这两者。简单地延续光线方向会导致严重的光照泄漏(Light Leaking)问题。

  • 核心观点: 光照泄漏的根源在于 视差不匹配(Incorrect Parallax)。屏幕空间光线和世界空间探针的光线源于不同的 原点(Origin),这导致它们之间存在一个未被追踪的“间隙”。

  • 问题剖析:

    1. 场景: 屏幕空间光线(Ray A)从某个表面点出发,没有命中任何物体。
    2. 查询: 系统选择一个世界空间探针,并使用其预计算好的一条方向最匹配的光线(Ray B)的结果。
    3. 泄漏: 由于 Ray A 的终点和 Ray B 的起点存在空间差异,这个间隙中的潜在遮挡物被完全忽略。结果是,本应被遮挡的世界空间光照信息“泄漏”到了最终着色点,造成了错误的反射或间接光。

二、 解决方案:基于原点邻近性的视差校正

为了解决上述泄漏问题,系统采用了一种巧妙的策略:牺牲微小的方向精度,来换取空间上的连续性。

  • 核心观点: 不再选择与屏幕空间光线 方向(Direction) 最匹配的世界空间光线,而是选择 原点(Origin) 与屏幕空间光线命中点(或追踪终点)最匹配的世界空间光线。

  • 关键术语:

    • 简单球体视差校正 (Simple Sphere of Parallax): 这是对此解决方案的称谓。它本质上是一个启发式算法,通过优先保证光线路径在空间上的连续性来消除间隙。
  • 权衡与效果:

    • 接受的误差: 接受了最终使用的世界空间光线与原始屏幕空间光线之间存在的轻微 方向性误差(Directional Error)
    • 获得的好处: 极大地减少了因几何间隙导致的光照泄漏,视觉效果得到显著改善。

三、 世界空间辐射缓存(World Space Radiance Cache)的结构与策略

为了高效地存储和查询世界空间光照信息,系统采用了一种稀疏且动态的缓存结构。

  • 核心观点: 世界空间探针缓存是一个 稀疏(Sparse) 的结构。探针并非均匀分布在整个世界中,而是按需放置在将要被屏幕空间探针查询到的区域。

  • 关键技术与数据结构:

    • 3D Clipmaps:

      • 定义: 一系列以摄像机为中心、分辨率不同的 3D 网格。当摄像机移动时,这些网格会“滚动”更新,以保持对摄像机周围区域的覆盖。
      • 作用: 用于管理和索引世界空间探针的位置。这种结构确保了屏幕上可见区域的探针密度相对恒定,从而获得了 有界屏幕尺寸(Bounded Screen Size) 的探针分布,避免了性能随距离和场景变化而剧烈波动。
      • 存储内容: Clipmap 的网格单元本身不存储庞大的探针数据,而是存储一个 间接索引(Indirection),该索引指向探针数据在图集(Atlas)中的实际位置。
    • 八面体探针图集 (Octahedral Probe Atlas):

      • 定义: 一种将球面数据(如来自四面八方的光照)高效编码并存储到 2D 纹理图集中的技术。
      • 存储信息: 每个探针在图集中存储两个核心信息: 辐射度(Radiance)追踪距离(Trace Distance)
  • 质量权衡:

    • 与屏幕空间探针相比,世界空间探针的数量要少得多。
    • 作为补偿,每个世界空间探针拥有远高于屏幕空间探针的分辨率,以存储更精确、更详细的远景光照信息。

世界空间探针的放置、缓存与性能预算

一、 核心实现:探针缓存与光线追踪流程

这部分内容深入探讨了世界空间探针(World Space Probe)的具体实现细节,核心在于如何高效地管理光线追踪的成本与数据的时效性。

核心观点

系统采用一种基于缓存的策略来决定何时进行全新的光线追踪,何时复用上一帧的数据。这是一种典型的用内存和复杂度换取渲染性能的策略。

  • 核心观点: 探针的放置和缓存是一个多步骤过程,第一步是识别出需要放置探针的位置。
  • 算法第一步:
    • 标记(Marking): 首先,系统会遍历所有需要世界空间探针提供信息的像素或位置,并在 3D Clipmap 结构中标记这些位置。这是为后续的探针分配和追踪做准备。

关键步骤

  1. 标记追踪位置 (Marking Positions):

    • 首先,在 Clipmap 结构中,系统会标记出所有需要进行光照插值的位置点。这些被标记的点即为世界空间探针(World Space Probe)的放置位置。
  2. 处理每个探针 (Processing Probes):

    • 对每一个被标记的探针,系统会检查其光照数据是否存在,并作出决策:
      • 缓存命中 (Cache Hit): 如果上一帧已经为该探针追踪过光线,系统会直接复用这些追踪结果。这是最高效的路径。
        • 光照传播 (Lighting Propagation): 为了让场景中的光照变化(如动态光源移动)能够传递开,系统会选择一小部分被复用的探针(cache hits)进行 强制重描 (retrace)。这确保了缓存数据不会变得完全陈旧。
      • 缓存未命中 (Cache Miss): 如果该探针是新出现的(例如,摄像机移动到新区域),缓存中没有可用数据。此时,系统必须:
        • 光照图集 (Atlas) 中为其分配一个新的存储位置。
        • 执行全新的光线追踪来计算该点的光照信息。

二、 性能瓶颈与预算管理

直接实现上述流程会遇到严重的性能问题,尤其是在动态场景中。

核心观点

无限制的光线追踪会导致 性能抖动 (Hitches)。通过引入一个 固定的性能预算 (Fixed Budget),并将追踪任务分级处理,可以实现一个 有界的最大成本 (Bounded Maximum Cost),从而保证实时渲染的稳定性。

问题根源:不稳定的开销

  • 当摄像机快速移动转向一个新角落时,会瞬间涌现出大量未被缓存的新探针位置。
  • 这会导致系统在单帧内需要执行海量的光线追踪任务,造成帧率急剧下降,即“卡顿”或“抖动”。

解决方案:分级预算系统

系统为每帧的光线追踪设定了一个固定的预算,该预算主要针对 全分辨率追踪 (full resolution traces)。超出预算的追踪任务会根据其重要性被降级或跳过:

  1. 超出预算的“缓存未命中”任务:

    • 这些任务对于填充场景中的黑色区域至关重要,不能完全跳过。
    • 处理方式: 依然执行追踪,但以更低的分辨率进行。这是一种优雅降级的策略,保证了视觉的完整性,同时显著降低了开销。
  2. 超出预算的“光照更新”任务 (对缓存命中的重描):

    • 这些任务的重要性相对较低,其目的是刷新光照,而不是填充缺失数据。
    • 处理方式: 完全跳过 (skip completely),直到后续帧的负载降到预算之内再恢复执行。

三、 BRDF重要性采样与追踪优化

为了进一步提升光线追踪的效率和质量,系统引入了重要性采样,但方式与屏幕空间探针有所不同。

核心观点

由于世界空间探针无法预知入射光的主要方向,系统转而利用 BRDF的分布 来进行重要性采样。为了处理高分辨率追踪带来的排序开销,系统引入了 追踪图块 (Trace Tiles) 的概念。

技术细节

  1. 基于BRDF的重要性采样:

    • 与屏幕空间探针不同,在追踪世界空间探针时,我们没有一个关于 入射光照 (incoming lighting) 的良好预估。
    • 因此,采样策略转向依据 BRDF 本身。系统会从屏幕空间探针的结果中 累积BRDF信息,用以指导世界空间探针的光线方向分布。
  2. 引入追踪图块 (Trace Tiles):

    • 世界空间探针需要追踪的分辨率远高于屏幕空间探针,这意味着光线数量巨大。
    • 每一条单独的光线进行排序和管理变得非常昂贵,不切实际。
    • 解决方案: 将探针的追踪方向(通常是一个半球或全天球)分割成多个 追踪图块 (trace tiles),以图块为单位进行操作,大幅降低了管理开销。
  3. 结构化重要性采样 (Structured Importance Sampling):

    • 图块的生成并非均匀的。系统会根据累积的BRDF信息,生成 分辨率与BRDF贡献成正比 的图块。
    • 这意味着在BRDF响应强烈的方向(如高光方向),图块的分辨率会更高,分配的追踪光线也更多。这本质上是在图块级别上实现了结构化重要性采样

世界空间辐照度缓存 (World Space Radiance Cache)

核心思想与目标

本节介绍了一种用于处理中远距离光照的 世界空间辐照度缓存 (World Space Radiance Cache, WSRC) 技术。其核心目标是解决传统屏幕空间 GI (如上一节提到的 Screen Space Radiance Cache) 在处理远景时,由于每像素仅有一条光线而导致的 时间稳定性差 (Poor Temporal Stability) 的问题。

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

为了在性能和质量之间取得平衡,WSRC 采用了一种高效的采样策略。

  • 核心观点并非对所有区域都进行均匀的光线追踪,而是有选择性地对靠近摄像机的追踪图块(Trace Tiles)进行超采样(Super Sampling)
  • 效果:这种方法等效于为每个世界空间探针(World Space Probe)提供了高达 4000 条追踪光线 (4,000 traces) 的信息量。
  • 优势:与屏幕空间方法中每个像素仅有一条光线相比,这种极高密度的采样确保了远距离光照的高度稳定性

空间滤波与漏光问题 (Spatial Filtering & Light Leaking)

在采集到探针数据后,需要通过空间滤波(Spatial Filtering)在相邻探针间共享信息以获得更平滑的结果。但这也引入了新的挑战。

  • 关键问题无法假定相邻探针之间相互可见 (Cannot Assume Mutual Visibility)。例如,一个探针可能在墙的另一侧,直接混合其光照信息会导致漏光(Light Leaking)。

  • 理想但昂贵的方案:沿着邻居探针的光线路径,通过当前探针存储的深度信息进行重投影(Retrace),以验证可见性。这个方案因为成本太高而被放弃。

  • 实际采用的廉价方案

    1. 执行一次单一的遮挡测试 (Single Occlusion Test):沿着邻居探针的光线路径选取一个位置,检查其对于当前探针是否可见。
    2. 成本极低:这个测试是 “几乎免费” (Nearly Free) 的,因为它 复用了探针追踪时已经捕获和存储的深度信息 (Probe Depths),无需追踪任何新的光线。
    3. 效果:在有效利用 空间复用 (Spatial Reuse) 的同时,显著减少了漏光现象。

混合渲染策略与优势

WSRC 通常不独立使用,而是作为混合渲染管线的一部分。

  • 混合策略
    • 近处(如前 2 米): 使用 屏幕空间辐照度缓存 (Screen Space Radiance Cache),以获得高频细节。
    • 更远距离: 切换到 世界空间辐照度缓存 (World Space Radiance Cache),以保证稳定性和性能。
  • 最大优势:这种组合 极大地改善了整体光照的时间稳定性 (Greatly improved temporal stability),尤其是在摄像机移动时,远处的间接光照不再闪烁。

WSRC 的其他应用

除了作为中远景间接光照的主要方案,WSRC 的稳定数据还可以被用于指导和改进渲染管线的其他部分:

  • 引导屏幕空间探针的重要性采样 (Guide screen probe importance sampling)。
  • 毛发 (Hair) 和一些 前向着色 (Forward Shading) 的物体提供间接光照。
  • 改善多弹跳全局光照 (Multi-bounce GI) 算法的质量,为其提供更可靠的第一次反弹信息。

最终渲染阶段:全分辨率整合 (Final Gather: Full-Resolution Integration)

在前面的步骤中,我们已经在低分辨率的屏幕空间辐射缓存(Screen Space Radiance Cache)中计算了入射光照。本节的核心任务是在全分辨率下,利用这些低分辨率数据完成最终的光照积分,以恢复精细的几何细节,并计算出最终的着色结果。

一、 漫反射积分 (Diffuse Integration)

1. 面临的挑战与传统方法

直接在全分辨率下进行漫反射积分会遇到性能瓶颈。

  • 传统方法:重要性采样 (Importance Sampling)

    • 流程: 为每个像素根据其 BRDF 进行重要性采样,生成若干方向,然后根据这些方向去采样低分辨率的辐射缓存。
    • 缺点: 这种采样方式是 非相干的内存访问 (Incoherent Fetches)。由于访存模式随机,效率极低,导致我们无法承担大量的采样,最终结果会充满噪点
  • 改进方法:过滤重要性采样 (Filtered Importance Sampling)

    • 流程: 使用辐射缓存的 Mipmap 来进行采样,利用硬件的纹理过滤来减少噪点。
    • 缺点: 会引入 自发光 (Self-Lighting) 的视觉瑕疵。这是因为它会错误地将物体背后的光照信息(位于半球之下)通过 Mipmap 模糊,“拉”到前半球的积分计算中,导致物体被自身背后看不见的光源照亮。
2. 最终方案:球谐光照 (Spherical Harmonics, SH)

为了实现高质量且高效的漫反射积分,讲座采用了基于球谐光照的方案。

  • 核心思想: 将复杂的辐射度信息用一组低阶的球谐函数系数来近似表示,从而将昂贵的积分运算转化为简单的向量点积。

  • 实现流程:

    1. 预计算阶段 (低分辨率): 在生成辐射缓存(Radiance Cache)的阶段,就将八面体图集(Octahedral Atlas)中的辐射度(Radiance) 预先转换成球谐系数 (SH Coefficients),并存储起来。
    2. 全分辨率整合阶段:
      • 全分辨率的像素只需直接读取对应位置的 SH 系数。这是一个 相干的内存读取 (Coherent Load),因为相邻像素很可能读取缓存中相邻的 SH 数据,非常高效。
      • 在片元着色器中,执行 基于 SH 的漫反射积分。这个计算过程非常廉价,本质上是预计算好的 BRDF 的 SH 系数与光照的 SH 系数进行点积。
      • 结果: 获得 高质量、平滑无噪点 的漫反射光照。

二、 高粗糙度镜面反射 (Rough Specular Reflections)

1. 面临的挑战
  • 性能开销: 对于粗糙度非常高的材质,其镜面反射波瓣(BRDF Lobe)非常宽广,需要追踪大量的光线才能准确地模拟其反射效果,这使得光线追踪的成本急剧增加
2. 核心洞察与优化方案
  • 核心洞察: 当材质粗糙度非常高时,其 GGX BRDF 波瓣会变得非常宽,形态上趋近于漫反射 的半球分布。

  • 优化方案:复用屏幕空间辐射缓存

    • 思想: 既然高粗糙度镜面反射在能量分布上近似于漫反射,我们就可以复用为漫反射准备好的屏幕空间辐射缓存,而无需追踪新的昂贵光线。
    • 实现流程:
      1. 在全分辨率下,仍然根据材质的 GGX 波瓣进行重要性采样,生成若干采样方向。
      2. 关键一步:不再为这些方向追踪新的光线,而是直接用这些方向去采样我们已经计算好的屏幕空间辐射缓存(Octahedral Atlas)。
    • 优势: 通过这种方式,我们用一次廉价的缓存查找代替了昂贵的光线追踪过程,为高粗糙度材质提供了高效且视觉效果足够近似的镜面反射结果。

融合屏幕空间信息与时间滤波

本部分内容聚焦于解决降采样追踪带来的两个核心问题:光照采样效率细节丢失,并探讨了时间滤波中遇到的挑战及其优化方向。

一、 利用屏幕空间辐射缓存进行重要性采样

为了高效地计算材质表面的间接光照(如遵循 BRDF 的重要性采样),传统方法需要从当前着色点追踪新的光线。这里提出了一种更高效的优化方案。

  • 核心观点: 复用已有的计算结果。与其为材质的 GGX 分布等追踪全新的光线,不如直接在我们已经计算和存储好的 屏幕空间辐射缓存 (Screen-Space Radiance Cache) 中进行采样。

  • 优势:

    • 性能提升: 避免了昂贵的新光线追踪步骤。
    • 质量保证: 自动利用了辐射缓存中已经完成的所有采样和滤波工作,结果质量更高、更稳定。

二、 恢复接触阴影:全分辨率Bent Normal

降采样追踪虽然高效,但其固有的低分辨率特性会导致一个明显的视觉问题:丢失精细的几何细节,尤其是物体与表面接触处的阴影。

1. 问题:降采样追踪丢失细节
  • 核心问题: 低分辨率的追踪探针无法捕捉到近距离的几何遮挡关系。
  • 具体表现: 接触阴影 (Contact Shadows) 丢失,导致小物体看起来像是“浮”在地面上,缺乏真实感。
2. 解决方案:全分辨率Bent Normal
  • 关键技术: 使用 全分辨率的Bent Normal 来弥补丢失的近场遮蔽信息。

    • Bent Normal: 本质上是一种 方向性遮蔽 (Directional Occlusion) 的表示。它是一个指向半球体内平均未被遮挡方向的向量。其长度可以表示遮蔽的程度。
  • 计算方法:

    • 通过在屏幕空间以全分辨率进行 快速、短距离的光线追踪 (Fast Screen Traces) 来计算。
    • 智能追踪距离: 追踪的距离与 屏幕空间探针的间距 (distance between screen probes) 动态绑定,这是一种高效的启发式策略。
3. 整合方案:结合远场与近场光照

为了将高分辨率的Bent Normal信息与低分辨率的 GI 结果无缝结合,讲座引用了 Horizon-Based Indirect Lighting 论文中的思想。

  • 核心观点: 将间接光照分解为远场近场两部分进行处理。

    • 远场辐照度 (Far-field Irradiance): 由低分辨率的 屏幕空间辐射缓存 (Screen Probe GI) 提供。
    • 近场辐照度 (Near-field Irradiance): 由全分辨率的 Bent Normal 所代表的遮蔽信息推算得出。
  • 整合逻辑:

    1. 将屏幕探针提供的 GI 视为来自“远方”的背景光。
    2. 使用Bent Normal来模拟近距离几何体对这些“远方”光线的遮挡。
    3. 通过论文中提到的 多重散射近似 (multi-bounce approximation) 算法,可以估算出被遮挡后,近场几何体之间相互反射贡献的能量。
  • 最终效果: 将Bent Normal应用到辐射缓存结果上后,接触阴影被成功恢复,全分辨率的几何细节得以体现,物体与环境的融合感显著增强。

三、 时间滤波优化:解决拖影问题

为了在屏幕上使用稀疏的、抖动的探针位置 (Jittered Probe Positions) 来模拟全屏效果,一个高质量的时间滤波器至关重要。

1. 问题:深度拒绝法的副作用
  • 当前方案: 使用 深度拒绝 (Depth Rejection) 策略进行时间滤波,而不是常见的邻域钳制 (Neighborhood Clamp)。
  • 优点: 能够产生非常稳定的结果,避免闪烁。
  • 缺点: 对光照变化反应迟钝。当物体移动时,其背后的间接光照无法足够快地更新,导致产生明显的 拖影 (Streaking) 现象。
2. 改进方向:利用运动信息
  • 核心思路: 为了让时间滤波器更智能,需要引入更多的场景动态信息。
  • 下一步优化: 通过 追踪光线命中点的速度 (hit velocity),让滤波器能够感知到场景的动态变化。这可以帮助滤波器判断历史数据是否已经“过时”,从而更快地响应光照变化,减轻拖影问题。

Final Gather - 动态物体处理与性能分析

一、 动态物体的光照更新策略

核心观点

为了解决快速移动物体导致的光照延迟或“鬼影”问题,系统需要动态调整受影响像素的滤波策略,从偏重时间稳定切换到偏重快速响应。

关键技术:快速更新模式 (Fast Update Mode)

  1. 追踪物体运动信息:

    • 在光线追踪阶段,除了记录深度信息,还需要追踪并记录击中点的 速度(Velocity) 信息。
  2. 识别影响范围:

    • 计算每个探针(Probe)投射到屏幕上的影响区域。
    • 通过分析探针的光线主要击中的是静态还是动态物体,来判断该探针是否属于快速移动物体
  3. 动态切换滤波模式:

    • 对于那些光照主要由“快速移动”探针贡献的像素,系统会为其启用快速更新模式
    • 该模式的本质是调整时域与空域滤波的权重:
      • 降低时间滤波(Temporal Filter)的强度:减少对前一帧历史数据的依赖,使光照能更快地响应当前帧的物体位置变化,有效减少拖影。
      • 增强空间滤波(Spatial Filter)的强度:由于时间滤波减弱,单帧噪声会更明显,因此需要加强像素邻域内的空间滤波来平滑噪声,弥补稳定性。

二、 性能分析与可伸缩性

测试环境

  • 平台: PlayStation 5
  • 内部渲染分辨率: 1080p
  • 输出分辨率: 4K (通过时间超分辨率技术 Temporal Super Resolution)

1. 高质量设置

  • 光线预算: 每像素 0.5 条光线 (0.5 RPP)
  • 总耗时: 3.7 ms
  • 成本分解:
    • 约 50% 用于 光线追踪 (Ray Tracing)
    • 约 50% 用于 探针放置、插值与积分 (Probe Placement, Interpolation & Integration)

2. 低质量(可伸缩)设置

此设置为展示系统的性能可伸缩性,通过调整参数来换取更高的性能。

  • 优化手段:
    • 降低 辐射缓存(Radiance Caches)的分辨率
    • 禁用Bent Normal 的计算。
  • 光线预算: 每像素 1/8 条光线 (0.125 RPP)
  • 总耗时: 2.1 ms

3. 质量对比与权衡

  • 与高质量设置(0.5 RPP)相比,低质量设置(1/8 RPP)的主要区别在于:
    • 时间稳定性降低:由于光线数量减少和时间滤波策略的潜在调整,画面在动态时可能出现更多噪点或闪烁。
    • 缺少接触阴影:这是最显著的视觉差异。因为禁用了弯曲法线,其产生的精细 接触阴影(Contact Shadows) 会丢失,使得物体与表面接触的地方看起来不够柔和自然。

三、 总结

该 Final Gather 系统展示了出色的性能可伸缩性,能够在不同硬件和性能要求下灵活调整。

  • 0.5 RPP 的预算下,即使在几何细节极其复杂的有机场景中,也能以 3.7 ms 的代价获得非常高质量的间接光照和接触阴影效果。
  • 通过简单的参数调整(如降低缓存分辨率、关闭弯曲法线),可以显著降低成本至 2.1 ms,为性能优先的场景提供了有效的降级方案。

Lumen Final Gather 总结与展望

一、 性能与质量的可伸缩性

本讲座中描述的 Final Gather (最终收集) 技术不仅适用于复杂的有机场景(Organic Scenes),在干净的室内建筑场景中也能以相同的算法和开销提供高质量的间接光照。

  • 预算模式 (Budget Mode):

    • 每像素 0.5 条光线 (0.5 rays/pixel)。
    • 在此开销下,无论是有机场景还是室内场景,都能获得良好的间接光照质量
  • 质量模式 (Quality Mode):

    • 在高端 PC 上,可将光线数量提升至 每像素 2 条
    • 能够实现极高质量的实时全局光照(Real-Time Global Illumination)。

二、 Lumen 中 Final Gather 的角色与职责

这些 Final Gather 技术构成了 Unreal Engine 5Lumen 系统的核心部分,但并非全部。理解其职责范围至关重要:

  • 核心解决的问题:

    • 动态全局光照 (Dynamic Global Illumination)。
    • 带阴影的 天光 (Shadowed Skylighting)。
    • 自发光网格 的照明 (Lighting from Emissive Meshes)。
    • 为材质提供粗糙高光 (Rough Specular) 的间接光照。
  • 与其他系统协同工作:

    • 它与 Lumen 的光线追踪反射 (Ray Traced Reflections) 相集成,共同覆盖了从粗糙到镜面的完整材质粗糙度范围。
  • 不直接负责的领域 (由独立技术处理):

    • 透明材质上的间接光照。
    • 体积雾 (Volumetric Fog) 中的间接光照。

三、 核心优势:与光线追踪实现解耦 (Ray Tracing Agnostic)

这是该 Final Gather 技术一个非常重要的设计特性,使其具有极高的灵活性和普适性。

  • 核心观点: 最终收集算法与底层使用的光线追踪技术无关
  • 支持的后端:
    • 硬件光线追踪 (Hardware Ray Tracing): 利用现代 GPU 的专用 RT Core。
    • 软件光线追踪 (Software Ray Tracing): 通过 稀疏有向距离场 (Sparse Signed Distance Fields, SDF) 实现,使其能在不支持硬件光追的 GPU 上运行。
  • 关键优势: 无论后端是硬件光追还是软件光追,都可以 使用完全相同的 Final Gather 算法,确保了视觉效果的一致性和渲染管线的简洁性。

四、 未来工作与待改进方向

尽管当前系统已经非常强大,但仍有几个可以持续优化的方向:

  1. 改善遮挡区域质量 (Disoccluded Areas):

    • 提升那些从被遮挡状态变为可见状态的区域的 GI 质量,这是实时GI中的一个经典难题。
  2. 提升高动态场景下的时间稳定性 (Temporal Stability):

    • 在物体或光源快速移动的场景中,通常需要降低时间滤波的权重并增加空间滤波。未来的目标是提升在这种高动态情况下的视觉稳定性。
  3. 提升多次反射 GI 质量:

    • 计划将 屏幕空间辐射缓存 (Screen Space Radiance Cache) 的思想应用到 表面缓存 (Surface Cache) 中,以进一步提升多次反弹(Multi-bounce)全局光照的质量。