实时光线追踪 (Real-Time Ray Tracing)

引言:光线追踪 vs. 光栅化 (Introduction: Ray Tracing vs. Rasterization)

这部分内容旨在建立一个高层级的理解,明确光线追踪与传统光栅化在思想上的根本区别及其各自的优劣势。

  • 核心思想对比:

    • 光栅化 (Rasterization):物体为中心。遍历每个三角形,然后判断它覆盖了哪些像素。
      for (Triangle T in Scene)
          for (Pixel P in Screen)
              // 判断 P 是否在 T 内部
    • 光线追踪 (Ray Tracing):像素(或者说,观察者)为中心。遍历每个像素,投射一条光线,然后判断它击中了哪个三角形。
      for (Pixel P in Screen)
          for (Triangle T in Scene)
              // 判断穿过 P 的光线是否击中 T
  • 复杂度与性能:

    • 理论上,光线追踪借助空间加速结构 (Spatial Acceleration Structure),如BVH,可以将单条光线的求交复杂度从 为场景中的三角形数量)优化到
    • 但不能简单认为光栅化就是 。现代GPU通过硬件遮挡剔除 (Hardware Occlusion Culling)视锥剔除 (Frustum Culling) 等技术,也极大地优化了性能。
    • 关键区别: 光栅化的优势在于经过数十年硬件发展的极致优化。光线追踪的核心优势在于其灵活性——可以从任意点向任意方向发射光线,这为实现物理真实的反射、折射和全局光照提供了简洁而强大的框架。
  • 挑战与未来:

    • 光线追踪的主要挑战是噪声 (Noise),尤其是在低采样率下(例如每像素样本数,spp较低时)。
    • 为了在实时应用中达到可接受的画质,通常需要结合降噪 (Denoising) 技术。
    • 短期未来是混合渲染 (Hybrid Rendering) 的时代:光栅化负责主要可见性判断,光线追踪用于处理特定效果,如精确的阴影、反射和全局光照。

26.1 光线追踪基础 (Ray Tracing Basics)

这一节深入探讨了光线追踪算法的基石,包括数学定义、核心函数、递归流程和两种经典的追踪模型。

1. 光线的数学定义

光线是一个半无限的直线,由一个原点 (origin) 和一个方向 (direction) 向量定义。

  • 核心公式:
    • : 光线的原点
    • : 光线的单位方向向量
    • : 沿光线方向的距离 表示光线前进方向上的点。

2. 核心算法:trace()shade()

光线追踪的流程可以被优雅地解耦为两个核心函数。

  • trace(ray) 函数:

    • 核心职责: 几何计算。负责接收一条光线,遍历场景(通常借助加速结构),找到与场景中最近的那个交点
    • 核心观点: 这个函数回答了“光线飞出去,撞到了什么?”的问题。
  • shade(point) 函数:

    • 核心职责: 着色计算。接收一个交点信息(位置、法线、材质等),计算该点的颜色或光照强度 (Radiance)
    • 核心观点: 这个函数回答了“撞到的这个点,它看起来是什么颜色?”的问题。

3. 相机光线/主光线的生成 (Generating Camera/Primary Rays)

这是光线追踪的起点,即为屏幕上的每个像素生成初始光线。

  • 关键术语:

    • 眼睛光线 (Eye Ray)相机光线 (Camera Ray):从相机(或眼睛)位置出发,穿过某个像素中心的光线。
  • 生成公式:

    • : 光线原点,即相机位置
    • : 最终计算出的光线方向
    • : 相机的坐标基 (右、上、前)。
    • : 屏幕分辨率
    • : 屏幕宽高比 ()。
    • : 与视场角 (Field of View, FOV) 相关,通常为
    • +0.5: 将整数像素坐标 移动到像素中心进行采样。

4. 递归光线追踪与次生光线 (Recursive Ray Tracing & Secondary Rays)

这是光线追踪强大表现力的核心所在:shade() 函数为了计算着色,可以再次调用 trace() 函数,形成递归。

  • 核心观点: 在着色点,为了知道来自其他方向的光照信息(如阴影、反射),我们可以从该点发射新的次生光线 (Secondary Rays),并追踪它们的结果。
  • 关键术语:
    • 光线深度 (Ray Depth): 光线弹射的次数。相机光线的深度为1,第一次反射/折射产生的光线深度为2,以此类推。
    • 阴影光线 (Shadow Ray): 从着色点射向光源,用于判断该点是否在阴影中(即路径上是否有遮挡物)。
    • 反射光线 (Reflection Ray): 沿镜面反射方向发射的光线,用于计算反射效果。
    • 折射光线 (Refraction Ray): 沿折射方向(穿过透明物体)发射的光线,用于计算透明和折射效果。

5. 两种经典模型:Whitted-Style vs. Path Tracing

  • Whitted风格光线追踪 (Whitted-Style Ray Tracing):

    • 提出者: Turner Whitted (1980)。
    • 核心思想: 递归地追踪镜面反射折射光线,并为每个交点向光源发射阴影光线
    • 局限性: 它是一个不完整的全局光照模型。它无法处理漫反射表面之间的光线多次弹射(如颜色溢出 Color Bleeding)、光泽反射 (Glossy Reflection) 和面光源产生的软阴影 (Soft Shadow)。
    • 伪代码结构:
      shade(point) {
          color = local_illumination; // 计算直接光照 (包含阴影测试)
          color += trace(reflection_ray);   // 递归处理反射
          color += trace(refraction_ray);  // 递归处理折射
          return color;
      }
  • 路径追踪 (Path Tracing):

    • 提出者: James Kajiya (1986)。
    • 核心思想: 完整求解渲染方程 (Rendering Equation),是实现全局光照 (Global Illumination) 的正确方法。它使用蒙特卡洛 (Monte Carlo) 方法,在每个交点处,根据表面材质(BRDF)随机采样一个方向,生成一条新的光线并继续追踪,形成一条完整的“路径”。最终通过平均每个像素的多条路径结果来得到最终颜色。
    • 优点: 物理上极其准确,能自然地产生所有光照现象(软阴影、颜色溢出、焦散等)。
    • 缺点: 收敛 (Convergence) 速度很慢。在低采样数下会产生大量噪声。要将噪声减少一半,需要将样本数量(光线数量)增加四倍。这使得它在实时应用中极具挑战性。

26.2 现代API中的光线追踪着色器 (Ray Tracing Shaders in Modern APIs)

这一节的核心是理解光线追踪不再是一个孤立的系统,而是被分解成一系列类似传统渲染管线的可编程着色器阶段,并深度集成到DirectX 12 (DXR)和Vulkan等现代API中。

1. 混合渲染思想 (Hybrid Rendering Philosophy)

  • 核心观点: 现代实时渲染不是用光线追踪完全取代光栅化,而是将两者结合,发挥各自优势。一个常见的模式是先用光栅化高效生成G-buffer(记录物体表面位置、法线、材质等信息),然后从G-buffer中的像素信息出发,发射光线来处理光栅化难以解决的问题。
  • 关键术语:
    • 混合渲染 (Hybrid Rendering): 结合光栅化和光线追踪的渲染范式。
    • 延迟光线追踪 (Deferred Ray Tracing): 基于G-buffer信息进行光线追踪的技术。
  • 实践箴言:

    "Use raster when faster, else rays to amaze." > (当追求速度时用光栅化,当追求惊艳效果时用光线追踪。)

2. DXR 光线追踪着色器管线 (The DXR Ray Tracing Shader Pipeline)

DXR定义了五种不同类型的着色器,它们在光线追踪的不同阶段被调用,共同完成一次追踪任务。

  • ① 光线生成着色器 (Ray Generation Shader):

    • 职责: 光线追踪的起点。通常每个像素执行一次,负责创建初始的相机光线 (Camera Ray),并调用 TraceRay() 函数启动硬件加速的追踪流程。可以类比为光追任务的 main() 函数。
  • ② 最近命中着色器 (Closest Hit Shader):

    • 职责: 计算最终着色。当光线找到最近的那个交点后,此着色器被执行。这是实现材质、计算光照、发起新的次生光线(如反射、阴影光线)的核心场所,功能上等同于上一节的 shade() 函数。
  • ③ 未命中着色器 (Miss Shader):

    • 职责: 处理“逃逸”的光线。如果一条光线没有击中场景中的任何物体,此着色器被调用。通常用于返回天空颜色或对环境贴图进行采样。
  • ④ 任意命中着色器 (Any Hit Shader):

    • 职责: 处理半透明/Alpha Test。在找到最近交点之前,每当光线与一个物体相交时,这个着色器都会被可选地调用。它的主要用途是进行Alpha测试:例如,如果击中了纹理的透明部分,可以告诉管线忽略这个交点,继续寻找下一个。
  • ⑤ 相交着色器 (Intersection Shader):

    • 职责: 自定义几何体求交。用于和程序化几何体(非三角形,如球体、分形等)进行相交测试。当光线击中这类物体的包围盒时,此着色器被调用来执行精确的数学求交计算。

3. 关键组件与概念

  • TraceRay() 函数: API提供的内置函数,用于在着色器代码中发起一次光线追踪。硬件会利用加速结构高效地执行遍历和求交。
  • 光线负载 (Ray Payload): 一个自定义的数据结构,伴随光线在不同着色器之间传递信息。例如,Closest HitMiss着色器计算出的颜色可以通过Payload返回给调用者。性能提示:保持Payload尽可能小,可以提高性能。
  • 光线区间 : 除了原点和方向,每条光线还定义了一个有效的距离范围。只有落在这个区间内的交点才会被报告。这对于避免自相交或实现仅在特定距离内有效的阴影光线非常有用。

26.3 顶层与底层加速结构 (TLAS & BLAS)

这一节解释了现代API如何组织场景几何体以实现高效的光线追踪。其核心是一个两级层次结构,专门为处理包含大量实例化和动态物体的复杂场景而设计。

1. 两级层次结构 (The Two-Level Hierarchy)

  • 核心观点: 为了高效地管理复杂的动态场景,加速结构被分为两个层级:底层加速结构 (BLAS) 负责处理单个物体的几何信息,而顶层加速结构 (TLAS) 负责组织和变换场景中所有物体的实例。

2. 组件详解 (Component Breakdown)

  • 底层加速结构 (BLAS - Bottom-Level Acceleration Structure):

    • 是什么: 一个包含实际几何数据(如三角形列表)的“黑盒”结构。你可以把它理解为一个为光线追踪优化过的静态网格 (Static Mesh)
    • 用途: 表示一个独立的、可被复用的资源,如一棵树、一辆车、一个角色。
  • 顶层加速结构 (TLAS - Top-Level Acceleration Structure):

    • 是什么: 一个包含实例 (Instance) 列表的结构。每个实例本质上是一个指针,指向一个BLAS,并附带一个自己的变换矩阵 (Transform Matrix)
    • 用途: 构建整个世界场景。通过实例化,可以用一个BLAS(例如一棵树的模型)在场景中放置成千上万棵位置、朝向、大小各不相同的树,而无需复制几何数据,极大地节省了内存和构建时间。

3. 动画与更新 (Handling Animation and Updates)

  • 核心观点: 针对动态物体,API提供了比完全重新构建BLAS更高效的更新方式。
  • 关键术语:
    • 更新 (Update): 一种低成本的操作,适用于顶点位置发生变化但拓扑结构不变的动画(如蒙皮动画)。它会重用原有的BVH结构,只更新节点包围盒。
    • 重建 (Rebuild): 一种高成本的操作,当几何体的拓扑结构发生改变(增删顶点/三角形)时必须执行。
    • 实践策略: 对于动态物体,可以连续多帧执行廉价的“更新”,并每隔N帧执行一次“重建”,以分摊成本并防止因结构退化导致的性能下降。

4. 光线追踪的几何分组策略

  • 核心观点: 为光线追踪准备几何数据时,分组策略与光栅化截然不同,这对性能至关重要。
    • 光栅化优化:材质 (Material) 分组。目的是为了最小化渲染状态(着色器、纹理等)的切换次数。
    • 光线追踪优化:空间局部性 (Spatial Locality) 分组。目的是为了构建更紧凑、更高效的BVH。将空间上邻近的物体放在同一个BLAS中,可以使得BVH的包围盒更小,从而减少光线需要测试的节点数量,提升遍历效率。

**26.4: 一致性 (Coherency) **

引言:为什么一致性是性能的关键?

  • 核心观点: 在现代硬件中,内存访问远比数学运算昂贵。一致性 (Coherency) 指的是计算任务(如光线、像素)在空间、时间或数据上的相似性。利用一致性,我们可以重用数据和计算结果,最大化缓存命中率,从而大幅提升性能。
  • 光栅化 vs. 光线追踪的一致性差异:
    • 光栅化 (Rasterization): 天然具有高一致性。其内层循环是处理同一物体表面上相邻的像素。这些像素极有可能共享相同的材质、着色器和纹理,访问的内存也高度集中,非常适合GPU的并行架构。但它的灵活性差,查询被限制在相机视锥内。
    • 光线追踪 (Ray Tracing): 天然具有高灵活性。可以从任意点向任意方向查询可见性。但这种灵活性导致了计算的非一致性 (Incoherent):相邻像素发出的光线可能弹射到场景中完全不相关的角落,导致缓存失效和GPU线程束发散 (Wavefront Divergence)。
  • 核心挑战: 实时光线追踪的工程核心就是在一个本质上非一致的灵活框架中,通过各种算法和数据结构**“寻找”并“创造”一致性**。

26.4.1 场景一致性:组织几何体 (Scene Coherency)

这一节探讨如何通过空间加速数据结构 (Spatial Acceleration Structure) 来组织场景几何体,从而利用场景本身的空间一致性,加速光线的求交测试。

1. 空间数据结构的核心权衡

对于实时应用(尤其是处理动态场景),选择和构建加速结构需要在以下四个方面做出权衡:

  • ① 结构质量 (Quality): 决定了遍历效率。高质量的结构(如紧凑的包围盒)能更快地剔除无效空间,减少不必要的求交测试。
  • ② 构造速度 (Construction Speed): 在静态场景中不重要,但在动态场景中,每帧构建的耗时是关键瓶颈。
  • ③ 更新速度 (Update Speed): 对于动画场景,仅更新结构(Refitting)而非完全重建(Rebuilding)的速度。
  • ④ 遍历效率 (Traversal Efficiency): 单条光线穿过该结构的速度,与结构质量和硬件架构(如SIMD宽度)紧密相关。

2. 主流的空间加速结构

  • 均匀网格 (Uniform Grid) 及其变体:

    • 思想简单,构建快速。但存在“体育场中的茶壶 (Teapot in a Stadium)”问题,即无法很好地适应几何密度不均匀的场景。
    • 改进版包括层次化网格 (Hierarchical Grid)、**哈希网格 (Hash Grid)**等。
  • 层次化细分结构 (Hierarchical Subdivision):

    • k-d树 (k-d Tree): 使用轴对齐平面递归地将空间无重叠地划分。理论上,因其严格的前后遍历顺序,一旦找到交点即可提前终止,但实践中构建复杂且对大型图元处理不佳。
    • 层次包围体 (BVH - Bounding Volume Hierarchy): 当今最主流的加速结构。它通过包围体(通常是AABB)来组织物体,而非划分空间。其节点的包围体可以重叠。NVIDIA、AMD、Intel的光追硬件和库都基于BVH。
      • 优势: 构建算法成熟快速,能很好地拟合场景,且非常适合处理动态物体和实例化。

3. BVH的构建与优化

  • 核心思想: 如何以最优方式构建BVH,以最小化光线遍历的平均开销。
  • 关键术语与技术:
    • 表面积启发式 (SAH - Surface Area Heuristic): 最重要的BVH构建质量评估标准。它提供了一个成本函数,用于在构建时指导如何划分节点,从而生成高质量的BVH。SAH倾向于产生体积小且包含图元多的叶子节点。
      • 成本函数:
        • 这个公式本质上是估计一条随机光线穿过整个BVH的平均求交成本。
    • 快速构建算法: 对于实时应用,SAH构建可能过慢。因此发展出许多快速构建算法,如线性BVH (LBVH),它利用空间填充曲线 (Space-filling Curve) 对图元进行排序,非常适合GPU并行构建。
    • 处理动态场景:
      • 调整 (Refitting): 当物体仅发生小范围移动时,只更新受影响节点的包围盒,速度极快,但多次调整后BVH质量会下降。
      • 两级层次结构 (TLAS/BLAS): 之前讨论过的结构,通过更新顶层实例的变换矩阵来高效处理刚体动画。

26.4.2 光线与着色一致性:组织计算任务 (Ray & Shading Coherency)

即使场景结构已经优化,如果光线本身是杂乱无章的,性能依然很差。这一节探讨如何组织光线着色计算本身,以创造一致性。

1. 利用光线一致性的方法

  • 核心观点: 尽管光线可以射向任何方向,但在实际渲染中(如相机光线、阴影光线、镜面反射光线),它们往往成束出现,具有相似的原点和方向。
  • 关键技术:
    • 光线包 (Packet Tracing): 将少量(如4、8、16条)方向相近的光线打包处理。利用SIMD (单指令多数据) 指令,可以同时对包里的所有光线与同一个三角形或BVH节点进行求交测试,极大提升吞吐量。这是CPU光追和早期GPU光追的核心优化。
    • 宽BVH (Wide BVH / MBVH): 一种数据结构侧的优化。构建分支因子更高(如4、8路而非2路)的BVH。这样,一条单独的光线在遍历时,也可以利用SIMD同时与一个节点的多个子节点进行测试,达到了类似Packet Tracing的效果,且对非一致光线的处理更灵活。
    • 光线重排序 (Ray Reordering / Stream Tracing): 针对路径追踪等高度非一致的光线工作负载。其思想是动态排序:不立即追踪完每条光线,而是将大量光线存入队列,根据其位置和方向进行排序,然后分批处理排序后变得一致的光线束。这相当于将一个混乱的随机访问模式,重组成一系列有序的流式访问。

2. 利用着色一致性的方法

  • 核心问题: 即使光线求交是一致的,它们命中的表面也可能分属不同物体,需要执行完全不同的着色器代码,这会导致严重的GPU线程束发散 (Wavefront Divergence)
  • 关键技术:
    • 延迟着色 (Deferred Shading for Ray Tracing): 思想与光栅化的延迟渲染一致。光线命中物体后不立即执行复杂的着色计算。而是将命中信息(位置、材质ID等)存入一个队列。当收集足够多的命中点后,对它们按材质/着色器进行排序,然后以大批量、高一致性的方式执行着色计算。
    • 实践建议: 渲染算法的设计应尽可能利用一致性。例如,对于环境光遮蔽,可以设计采样模式,让相邻像素采样相似方向的光线,然后对这些光线进行重排序处理,以最小化发散。

26.5 降噪 (Denoising): 让低采样率光追成为可能

1. 核心问题与目标

  • 核心观点: 实时光线追踪(尤其是路径追踪)为了保证帧率,每个像素只能负担极少量的光线样本 (samples per pixel, spp),这必然导致渲染结果充满噪声 (Noise)降噪 (Denoising) 算法的目标就是接收这张充满噪声的图像,并结合一系列辅助数据,智能地滤除噪声,生成一张视觉上干净、可信的图像。它是现代实时光线追踪流程的基石
  • 关键思想:
    • 降噪的最终目的不一定是数学上的完美重建,而是追求视觉上的可接受性。通常,轻微的模糊比闪烁的噪点更能让玩家接受。
    • 时间抗锯齿 (TAA) 本身就可以看作是一种基础的降噪器,因为它通过反馈回路(feedback loop)累积历史帧信息来平滑结果。

2. 基本原理:加权平均 (Fundamental Principle: Weighted Average)

大多数降噪算法的底层模型都可以简化为一个对邻域像素进行加权平均的过程。

  • 核心公式:

    • : 像素 降噪后的最终颜色。
    • : 像素 邻域 内某个像素 带噪声的输入颜色
    • : 权重函数,这是整个算法的“灵魂”。
  • 权重函数 的作用:

    • 这是个“智能”权重。它会判断邻域像素 与中心像素 相似度。如果两个像素看起来属于同一个物体表面(例如,它们的深度、法线、材质ID等信息相近),则 会获得一个高权重;反之,如果它们位于物体边缘的两侧,则 的权重会很,从而避免将物体轮廓模糊掉。这本质上是一种边缘保留滤波 (Edge-Aware Filtering)

3. 通用策略与辅助数据 (Common Strategies & Auxiliary Data)

为了让权重函数做出更准确的判断,现代降噪器会利用大量额外信息。

  • 辅助数据 (Auxiliary Data): 降噪器的主要“燃料”来自G-buffer,通常包含:

    • 深度 (Depth)
    • 表面法线 (Normals)
    • 运动矢量 (Motion Vectors) (用于时域降噪)
    • 材质/物体ID (Material/Object ID)
  • 通用降噪策略:

    • 时域累积 (Temporal Accumulation): 利用运动矢量将前一帧的降噪结果“投影”到当前帧,并与当前帧的噪声输入进行混合。这极大地增加了有效的样本数量,是提升质量的关键。
    • 分离处理 (Separating Components): 将渲染结果拆分为不同部分,分别进行降噪。例如,将间接光照(通常是低频、平滑的)与直接光照/反射(可能包含高频细节)分开处理,使用不同强度的滤波器。
    • 比率估计器 (Ratio Estimator) / 分离光照与纹理: 一种非常有效的技巧,避免在降噪时模糊掉高清纹理。
      1. 计算出带噪声的最终光照结果
      2. 单独计算出不受光照影响的材质反射率(如 Albedo 贴图)
      3. 计算出无纹理光照 。这个 相对平滑。
      4. 对平滑的 进行降噪,得到
      5. 将降噪后的光照与材质重新组合:最终颜色

4. 关键技术:方差引导滤波 (Key Technique: Variance-Guided Filtering)

  • 核心观点: 不要对所有像素都使用相同强度的模糊。应该根据每个像素的“噪声程度”来自适应地调整滤波强度
  • 如何衡量噪声? 使用方差 (Variance)。在蒙特卡洛方法中,样本的方差越大,代表结果的不确定性越高,即噪声越严重。
  • 实践方法:
    1. 在光线追踪时,为每个像素计算颜色样本的方差
    2. 在降噪阶段,方差高的区域(噪点多)使用一个尺寸更大、强度更高的模糊核。
    3. 方差低的区域(较干净)使用一个尺寸更小、强度更弱的模糊核,以最大程度保留细节。
  • 代表性算法: SVGF (Spatio-Temporal Variance-Guided Filtering) 是一个著名的算法,它将时域累积和方差引导的空间滤波结合在了一起。

5. 针对特定效果的降噪 (Denoising for Specific Effects)

  • 环境光遮蔽 (AO) / 软阴影: 滤波核的尺寸可以由光线到遮挡物的距离决定。遮挡物近,接触阴影应更锐利,使用小核;遮挡物远,阴影更柔和,使用大核。
  • 反射 (Reflections): 常用技巧是在半分辨率下追踪反射光线,然后通过一个智能的、边缘保留的升采样滤波器来重建全分辨率的图像,同时完成降噪。
  • 全局光照 (GI): 通常需要多种降噪器组合使用。例如,寒霜引擎对光照贴图的预览,会使用基于方差的模糊,并在模糊时严格保证数据不会在不同物体的UV分块之间“泄漏”。

6. 其他前沿方法 (Other Advanced Methods)

  • 纹理空间降噪 (Texture-Space Denoising): 直接在物体的UV空间(纹理坐标)中进行着色和降噪,而不是在屏幕空间。
    • 优点: 在纹理空间中,物体表面是连续的,可以轻松实现时域稳定;可以解耦着色频率和屏幕分辨率。
  • 深度学习降噪 (Deep Learning / AI Denoising):
    • 核心思想: 使用大量“带噪声的输入”和“完美的参考图像(Ground Truth)”对一个卷积神经网络 (CNN) 进行训练。网络会“学习”到如何从噪声中恢复出干净的图像。
    • 优点: 效果通常非常出色,尤其在恢复复杂细节方面,可能优于传统滤波器。NVIDIA的OptiX Denoiser和DLSS就是典型代表。
    • 挑战: 需要离线训练,运行时有固定的性能开销(推理成本),并且依赖于训练数据集的质量。

26.6 光线追踪中的纹理过滤 (Texture Filtering in Ray Tracing)

1. 核心问题:为何光追中的纹理过滤更复杂?

  • 核心观点: 传统光栅化通过处理2x2的像素组(Pixel Quad)来隐式计算纹理坐标在屏幕空间的梯度(gradients),从而硬件可以自动选择正确的Mipmap层级,实现高质量的纹理过滤。但在光线追踪中,光线是独立、发散的,尤其是在多次弹射(如反射、折射)后,一条光线失去了与屏幕像素的直接关联,使得传统方法失效。
  • 不进行过滤的后果: 如果总是采样最高精度的Mipmap层级(Level 0),会在纹理表面产生严重的锯齿和摩尔纹 (Aliasing and Moiré Patterns),尤其是在远处或以小角度观察纹理时。

2. 解决方案

为了在光线追踪中正确计算纹理的足迹 (Footprint) 以选择合适的Mipmap,主要有两种技术:

  • ① 光线微分 (Ray Differentials):

    • 核心思想: 这是一种更精确、但更复杂的方法。它通过为每条光线附加额外的数据,来追踪光线束如何随屏幕空间变化而发散
    • 关键技术: 每条光线除了原点 和方向 外,还携带了4个偏导数向量,它们描述了原点和方向相对于屏幕坐标 的变化率。
      • 携带数据:
    • 工作流程: 这些“微分”信息会随着光线的每一次反射和折射,通过特定公式进行迭代更新。当最终击中纹理表面时,就可以利用这些信息精确计算出光线束在该表面的覆盖范围(即纹理足迹),从而选择最合适的Mipmap层级。
    • 评价: 通常能提供最接近“Ground Truth”的效果,但计算和存储开销更大,且偶尔可能导致过度模糊。
  • ② 光线锥 (Ray Cones):

    • 核心思想: 这是一种更简单、更近似的方法。它不追踪无限细的单条光线,而是追踪一个有体积的圆锥体,该圆锥体代表了穿过一个像素区域的光线集合。
    • 工作流程: 纹理足迹的大小由光线锥的扩散角度光线传播的距离共同决定。锥体在表面上的投影面积越大,就应该选择更模糊的(更高层级的)Mipmap。
    • 评价: 实现相对简单,开销较小。但在多次复杂的弹射后,尤其是在曲面上,其精度可能会下降,导致过滤不足或过度模糊。

26.7 推测:光线追踪的未来与创新应用 (Speculation)

这一节展望了实时光线追踪技术在未来可能的发展方向,不仅限于提升画面,更在于它作为一种通用工具的潜力。

1. 提升渲染质量 (Improving Rendering Quality)

  • 核心观点: 光线追踪将首先被用于解决传统屏幕空间技术的固有缺陷,提供物理上更准确、视觉上更稳定的效果。
  • 具体应用:
    • 反射 (Reflections): 彻底取代屏幕空间反射 (SSR),能够正确反射屏幕外物体、实现多层反射,并精确处理各种复杂材质(如各向异性)。
    • 次表面散射 (Subsurface Scattering, SSS): 通过在物体内部追踪光线来模拟光在玉石、皮肤等半透明材质中的散射,效果更真实。
    • 体积渲染 (Volumetric Rendering): 摆脱传统的体素光线步进(Ray Marching),可能转向基于Woodcock Tracking等更物理的方法来渲染云、雾、烟等参与介质。
    • 粒子/广告牌 (Particles/Billboards): 这是一个挑战与机遇并存的领域。如何让面向相机的广告牌在被任意方向的光线击中时表现正确?这可能需要结合相交着色器 (Intersection Shader) 创建新的几何表达方式。

2. 超越传统渲染:“玩法光追” (Gameplay Ray Tracing)

  • 核心观点: 光线追踪本质上是一个高精度的可见性查询工具,这个能力可以被用于渲染之外的各种领域。
  • 潜在应用:
    • 物理 (Physics): 在GPU上实现更精确的碰撞检测
    • 音频 (Audio): 模拟声音的传播、遮挡与混响(Reverb)。
    • AI 与游戏逻辑: 实现更可靠的NPC视线(Line-of-Sight)判断

3. 架构革新:可调用着色器 (Architectural Revolution: Callable Shaders)

  • 核心观点: 可调用着色器 (Callable Shader) 是光线追踪API引入的一种类似“函数指针”的强大新工具,它允许一个着色器在运行时以可编程的方式调用另一个着色器。它的出现可能会引发渲染管线和引擎架构的深刻变革。
  • 解决的核心痛点: 着色器变体 (Shader Permutation) 爆炸。在传统引擎中,为了支持多种功能组合(如5个开关选项),往往需要预编译 个不同版本的着色器,造成巨大的内存占用和管理复杂性。
  • 使用可调用着色器:
    • 只需一个主着色器,它根据需要调用5个分别实现不同功能的小型“子着色器”。
    • 极大地减少了内存占用,并使着色器逻辑更加模块化
  • 未来潜力: 可以用于构建高度灵活的材质系统、模块化的后处理管线、动态的贴花(Decal)应用等,让艺术家和开发者能以更自由的方式组合渲染功能。