
《暗黑破坏神:不朽》是一款由 暴雪娱乐和 网易联合开发的免费多人动作角色扮演游戏 (ARPG)。《暗黑破坏神:不朽》是《暗黑破坏神》系列的新篇章,将于 2022 年发布。该游戏填补了《暗黑破坏神 2》和《暗黑破坏神 3》之间的故事空白,并围绕世界石碎片展开了全新冒险。玩家将探索圣堂大陆,与恶魔和堕落势力作战。
随着移动 GPU 架构的创新和硬件加速功能的突破,光线追踪技术正在逐渐从桌面设备迁移到移动设备,成为高保真图形渲染的核心驱动因素之一。计算逼真的动态反射需要大量计算,但在功耗受限的移动平台上,专用硬件单元可以实现这一点。通过实时跟踪光线在场景中的传播路径,该技术可准确模拟镜子、金属和液体等复杂表面的反射行为。光线追踪克服了传统光栅化方案的空间限制和近似误差,并支持动态光源、屏幕外对象和多级反射的全球一致表达。
移动设备上的硬件光线追踪
硬件光线追踪技术主要包括两种实现范式:光线追踪流水线和光线查询。
光线追踪流水线通过专用着色器阶段(光线生成 / 相交 / 最近命中着色器)构建完整的流水线。虽然它可以实现精确的光线交互控制,但光线跟踪流水线需要独立的流水线配置,这会增加开发复杂性。
另一方面,光线查询允许直接从传统计算或片段着色器启动光线查询,这使其成为移动光线追踪的核心技术。由于无需单独的流水线,光线查询不仅大大简化了开发流程,还具有以下三大优势:
- 提供与异构计算环境和非完整光线追踪硬件之间的兼容性
- 支持在任何着色阶段按需调用光线追踪
- 通过减少资源用量,满足移动平台的带宽和功耗限制,并为移动游戏中的动态全局光照和实时反射等高级效果提供了可行的基础
《暗黑破坏神:不朽》使用 Vulkan 来充分利用 GPU 的硬件光线追踪功能。该游戏会实时计算光线穿过场景的路径,并考虑复杂的材质属性,以便在 Android 设备上实现突破性的实时反射效果。


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


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

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

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

最后,实际参与反射计算的模型只占场景的一小部分。您可以异步读取 GPU 返回的反射模型标识数据,以消除不参与反射的模型/材质,从而有效减少着色阶段中的绘制调用次数(当材质和网格提交给 GPU 以进行绘制时,就会发生绘制调用)。
基于物理的镜面反射
为了实现高保真反射,反射表面会根据粗糙度分为以下三类:
- 无反射 - 可以跳过对这些 Surface 的反射计算,以节省资源。如果表面非常粗糙,反射会变得模糊不清,因此贡献不明显。
- 镜面反射 - 就像光滑的镜子一样,反射的图像清晰且不模糊。从视线方向直接拍摄反射线。
- 光滑反射 - 系统会根据 GGX 重要性采样来模拟具有一定粗糙度的表面反射,该采样方法可同时考虑计算效率和物理准确性。发射线条时,反射会偏向镜面反射的主要方向,从而提高亮点区域的采样效率。
为了在功耗有限的情况下实现可接受的图片质量,Diablo Immortal 团队采用了 1SPP+Denoiser 解决方案。也就是说,《暗黑破坏神:不朽》团队为每个像素采集了 1 个样本,然后使用了时空降噪算法来平滑由低采样率引入的大量噪声。
《暗黑破坏神:不朽》团队选择了 AMD FidelityFX 降噪器中的反射降噪器,这是一种针对光线追踪反射和屏幕空间反射进行了优化的高性能降噪器。反射降噪算法的核心优势在于降噪算法的时间空间混合降噪算法:通过融合当前帧和历史帧数据(基于运动补偿),再结合空间滤波技术(例如基于方差的边缘保留滤波),反射降噪算法可在非常低的采样率下高效消除噪声并输出流畅的反射效果。
为了适应自行开发的渲染管道的特性并满足移动设备的严格性能限制,在集成 AMD FidelityFX Reflection Denoiser 时,Diablo Immortal 团队实现了有针对性的简化和架构调整。
使用 Vulkan 实现高保真光线追踪
《暗黑破坏神:不朽》可在各种支持 Vulkan 的 Android 设备上运行,在这些设备上,《暗黑破坏神:不朽》团队充分利用了创新的 GPU 硬件光线追踪功能。Vulkan 减少了开发开销和摩擦,有助于向 Android 用户提供优质的《暗黑破坏神:不朽》内容和游戏体验。