
《暗黑破坏神:不朽》是一款免费大型多人在线动作角色扮演游戏 (ARPG),由暴雪娱乐和网易联合开发。《暗黑破坏神:不朽》作为暗黑破坏神系列的新篇章,于 2022 年推出。该游戏填补了《暗黑破坏神2》和《暗黑破坏神3》之间的故事空白,并围绕着世界之石的碎片展开了一场新的冒险,玩家在庇护之地大陆上探索,与恶魔和腐化势力作战。
随着移动 GPU 架构的创新和硬件加速能力的突破,光线追踪技术正逐步从桌面端向移动设备迁移,成为高保真图形渲染的核心驱动力之一。计算物理真实的动态反射在计算上要求很高,但专用的硬件单元使这在功耗受限的移动平台上成为可能。通过实时追踪光线在场景中的传播路径,该技术能精确模拟镜面、金属和液体等复杂表面的反射行为。光线追踪克服了传统光栅化方案的空间限制和近似误差,并支持动态光源、屏幕外对象和多级反射的全局一致表达。
《暗黑破坏神:不朽》团队决定使用基于硬件的光线追踪,精确呈现屏幕外物体的反射,避免了传统依赖当前屏幕内信息的方法造成的物体缺失和边缘断裂等问题。光线追踪提供了更真实的镜面反射效果,尤其是在动态场景中。其他解决方案受限于摄像机视角和渲染管线,通常会导致视觉缺陷。
移动设备上的硬件光线追踪
硬件光线追踪技术主要包括两种实现范式:光线追踪管线和光线查询。
光线追踪管线通过专用着色器阶段(光线生成/求交/最近命中着色器)构建完整的管线。尽管它能实现精确的光线交互控制,但光线追踪管线需要独立的管线配置,这增加了开发复杂性。
另一方面,光线查询允许直接从传统的计算或片段着色器启动光线查询,使其成为移动光线追踪的核心技术。通过消除对独立管线的需求,光线查询不仅显著简化了开发过程,而且还具有三大优势
- 提供与异构计算环境和非完整光线追踪硬件的兼容性
- 支持在任何着色阶段按需调用光线追踪
- 通过降低资源使用量,满足移动平台的带宽和功耗限制,并为移动游戏中的动态全局光照和实时反射等高级效果提供了可行基础。
《暗黑破坏神:不朽》使用 Vulkan 来利用 GPU 的硬件光线追踪能力。该游戏实时计算光线在场景中的路径,并考虑复杂的材质属性,从而在 Android 设备上实现突破性的实时反射效果。


加速结构
加速结构是硬件光线追踪的核心。加速结构通过分层数据组织,极大地提高了光线求交测试的效率。
该系统通常有两个层级:顶层加速结构 (TLAS) 和底层加速结构 (BLAS)
- TLAS 扮演着场景管理器的角色 — 通过记录所有 BLAS 实例的空间变换矩阵(包括位置、旋转和缩放),TLAS 实现了动态场景的全局组织。例如,TLAS 允许开发者在场景中以不同的位置和姿态分布数百个相同树木模型的实例;因此,开发者每帧只需要更新移动物体的变换矩阵,而无需重建几何体。
- BLAS 作为基本单元 — 负责高效编码单个 3D 对象的几何细节,BLAS 通过包围盒层次结构 (BVH) 算法建立空间索引结构,以便在光线检测过程中快速跳过不相关的区域。
这种分层设计使得光线追踪管线能够形成高效的检测链:光线 ==> TLAS(粗筛对象实例) ==> BLAS(精确求交)。
分离动态和静态模型是最小化加速结构构建成本的关键
- 静态模型 — BLAS 只需要在初始化阶段构建一次,并可在后续场景加载中直接复用。为避免大规模场景的加载延迟,可采用分帧异步预构建技术,将 BLAS 构建任务分摊到多个帧中。
- 动态模型
- 骨骼动画驱动 — 每帧需要由计算着色器并行计算蒙皮顶点数据以生成新的顶点缓冲区,然后触发相应 BLAS 的增量更新,避免完全重建以提高性能。
- 刚体变换 — 如果只涉及平移/旋转/缩放变换,则无需修改 BLAS,只需在 TLAS 中更新其世界变换矩阵,然后触发 TLAS 快速更新过程。
定期重建对于维护光线追踪动态场景中的加速结构效率至关重要。当动态物体发生几何拓扑的显著变化,例如变形或大规模顶点位移时,原始的空间划分可能会失效,从而降低光线遍历期间的碰撞检测性能。因此,必须每 N 帧触发一次高度动态的 BLAS/TLAS 的完全重建,而不是增量更新。
最后,为了优化光线追踪渲染的性能,采用基于角色可见区域的动态 TLAS 构建策略:只有角色活动半径阈值内的模型才被纳入 TLAS,以减少光线求交计算的核心开销。
光线追踪反射
光线追踪反射相对于屏幕空间反射 (SSR) 和平面反射(将场景投影在一维上的简单表面)等传统技术具有多项优势。光线追踪反射物理模拟了光线路径,精确捕捉场景内外的动态物体,支持曲面和非平面表面的自然反射,并能实现镜面等多次光线弹跳效果。相比之下,SSR 受限于屏幕上可见的信息,而平面反射在复杂场景中容易出现视觉错误或失真。


光线追踪反射在原理上与传统 SSR 相似:光线追踪反射以逐像素的方式沿视线反射方向发射光线,并计算光线与场景物体的交点。光线查询 API 返回的交点包含几何信息(包括实例 ID、几何索引和图元索引)和三角形级别的光栅化参数(重心坐标),但不包含像素颜色数据。典型的解决方案使用无绑定资源绑定技术,将场景的所有纹理和材质参数预编译成一个全局索引数组。利用光线查询返回的几何标识符,可以查找相应材质的物理属性(如法线贴图和粗糙度),然后结合重心坐标插值计算表面着色信息,并通过光栅化重建交点的真实颜色值。
然而,在实现过程中,《暗黑破坏神:不朽》团队发现了两个显著的技术问题
- 光照模型被迫统一,这与项目历史上积累的多种着色系统相冲突,并会导致镜面材质与原始材质不匹配。
- 顶点格式的多样性导致光栅化阶段指令分支效率下降,这在移动设备的紧张性能预算下是一个主要问题。
《暗黑破坏神:不朽》团队创新性地引入了可见性缓冲区,将几何处理与着色计算分离
- 光线追踪阶段 — 通过光线查询实时捕获像素级光线命中信息。交点的 3D 空间标识符(包含
InstanceID
和PrimitiveIndex
)被编码为紧凑的可见性 ID 并写入屏幕空间缓冲区。 - 着色阶段 — 类似于顶点和像素着色器执行的操作,可见性缓冲区中的几何标识符被动态解析,原始模型的顶点属性(如 UV 和法线)和基于物理的材质贴图被获取,并最终执行与材质类型相关的着色计算。
该解决方案允许艺术资产连接到光线追踪反射系统,而无需修改顶点格式或着色器。
具体渲染步骤
光线查询通道
对应光线追踪阶段,生成屏幕空间反射的可见性缓冲区
- Color0
- 格式:R32G32UInt
- R = TriangleID,G = Barycentrics

- 深度
- 格式:Depth32F
- D = EncodeAsFloat(InstanceIdx, GeometryIdx)
- 交点的材质标识符以 32 位浮点数编码,并写入深度缓冲区,供下一阶段的材质深度编码匹配检测技术使用

与计算着色器相比,像素着色器中的光线查询具有以下优势
- 管线集成 — 管线直接嵌入现有前向/延迟渲染管线,保持渲染管线状态的连续性。
- 移动带宽优化 — 对于移动分块式架构,当光线命中数据写入
RenderTarget
时,可触发片上无损压缩,与传统计算着色器输出到缓冲区相比,减少内存带宽消耗。 - 光线数量控制 — 通过预计算阶段结合模板测试,可以标记和拒绝非反射区域。
解析通道
在着色阶段(请参阅光线追踪反射),《暗黑破坏神:不朽》团队通过使用深度测试硬件单元,并分批次对材质进行着色,实现了快速标识符匹配。
对于每种材质,都会发出一次全屏绘制通道。顶点着色器动态重建当前材质的编码标识符。使用深度等值测试,将标识符与深度缓冲区中的编码值进行比较,仅保留编码值完全匹配的像素,即属于当前材质实例的像素。保留的像素执行相应的材质着色器。
接下来,在像素着色器中实现了高精度材质再现
- 几何数据解码 — 从可见性缓冲区中提取三角形标识符(
MeshID
+PrimitiveID
)和重心坐标,并从顶点缓冲区动态加载相应三角形的顶点属性(位置、UV、法线等)。由于每个模型都作为独立材质进行着色,因此不需要绑定等高级功能。 - 表面参数重建 — 使用重心坐标插值计算交点的 UV 坐标。根据插值后的 UV 执行软件光栅化以采样贴图。
- 着色计算复用 — 直接复用现有着色器代码,以保持与主渲染管线相同的材质逻辑。

最后,实际参与反射计算的模型只占场景中非常小的一部分。GPU 返回的反射模型识别数据可以异步读取,以剔除不参与反射的模型/材质,有效减少着色阶段的绘制调用次数(绘制调用是指将材质和网格提交到 GPU 进行绘制时发生的操作)。
基于物理的镜面反射
为了实现高保真反射,反射表面根据粗糙度分为三类
- 无反射 — 这些表面的反射计算可以跳过以节省资源。如果表面非常粗糙,反射会变得模糊和微弱,因此贡献不明显。
- 镜面反射 — 就像光滑的镜子一样,反射图像清晰不模糊。沿视线方向直接发射光线进行反射。
- 光泽反射 — 具有一定表面粗糙度的反射是基于GGX 重要性采样模拟的,既能兼顾计算效率,又能保证物理准确性。光线发射时会偏向镜面反射的主方向,从而提高了高光区域的采样效率。
为了在有限功耗下实现可用的图像质量,《暗黑破坏神:不朽》团队采用了1SPP+降噪器解决方案。也就是说,《暗黑破坏神:不朽》团队对每个像素进行一次采样,然后使用时间/空间降噪算法来平滑低采样率引入的大量噪声。
《暗黑破坏神:不朽》团队选择了 AMD FidelityFX Denoiser 中的 Reflection Denoiser,这是一款针对光线追踪反射和屏幕空间反射优化的,高性能降噪器。Reflection Denoiser 的核心优势在于其时空混合降噪算法:通过融合当前帧和历史帧数据(基于运动补偿),结合空间滤波技术(如方差引导边缘保留滤波),Reflection Denoiser 能够以极低的采样率有效消除噪声并输出平滑的反射效果。
为了适应自研渲染管线的特性并满足移动设备严格的性能限制,《暗黑破坏神:不朽》团队在集成 AMD FidelityFX Reflection Denoiser 时,进行了有针对性的精简和架构适配。
基于 Vulkan 的高保真光线追踪
《暗黑破坏神:不朽》在广泛支持 Vulkan 的 Android 设备上运行,《暗黑破坏神:不朽》团队充分利用了创新的 GPU 硬件光线追踪能力。Vulkan 减少了开发开销和阻力,促进了《暗黑破坏神:不朽》高质量内容和玩法的交付给 Android 用户。
开始使用 Vulkan 进行光线追踪
正如《暗黑破坏神:不朽》所展示的,在 Android 上实现光线追踪效果涉及在具备能力的硬件上利用 Vulkan API。有兴趣直接使用 Vulkan 的开发者可以参考 ARM 的《Android 上基于 Vulkan 的光线追踪学习》或高通的《Adreno 移动 GPU:最佳实践》中的光线追踪部分。有关 API 的详细信息,请参阅官方 Khronos 《Vulkan 中的光线追踪》规范。
对于基于引擎的开发,虚幻引擎与 ARM 合作,为移动设备上的 Lumen 提供了硬件光线追踪的实验性支持。尽管 Unity 对 Android 上的硬件光线追踪支持仍在发展中,请关注 Unity 的更新。