硬件光线追踪管线
Hardware Ray Tracing Pipeline
高端 GPU 提供硬件加速的光线追踪,它像 GPU 中独立于光栅管线和计算管线的另一条管线,但能与它们协调同步。场景几何要先组织成两层加速结构(TLAS 实例层与 BLAS 几何层),光线发射后由 any-hit、closest-hit、miss 等着色器处理结果。由于还不够快,GPU 光追通常与光栅化结合成混合渲染:先光栅化 G-buffer,再对镜面、反射和间接光发射光线。
加速结构(卷 II 11.4.6.3)
光线追踪也可以完全在 CPU 上或用计算着色器实现;硬件光追则要求把场景几何以加速结构的形式交给 GPU。它相当于一种场景图,让光追着色器快速查出每条光线可能击中哪些图元。下图是两层结构。
flowchart TD
T["TLAS 顶层加速结构"] --> I1["实例: id + 变换矩阵 + BLAS 引用"]
T --> I2["实例: id + 变换矩阵 + BLAS 引用"]
I1 --> B1["BLAS 底层加速结构: 几何图元及其包围体"]
I2 --> B1
I2 --> B2["BLAS: 程序化几何节点, 如解析球"]- TLAS(top-level acceleration structure)描述构成场景的几何图元实例;每个条目含实例 id、把几何放到世界空间的变换矩阵,以及对 BLAS 中几何节点的引用。
- BLAS(bottom-level acceleration structure)存放实际的几何图元和它们的包围体;也可以包含程序化几何节点,让光线与球等解析表面求交。
- 通用的 BVH 与求交原理见 空间数据结构、光线求交测试。
发射光线与处理结果
- CPU 上的应用调用光线分派 (ray-dispatch) 函数生成一批批光线;GPU 上的着色器也能直接产生新光线。
- 检测到相交时调用两类着色器:
- any-hit 着色器:光线上的每一个交点都会调用;可以拒绝该命中,或接受并让测试继续或提前终止,还能修改光线参数。
原书问题(11.4.6.3):any-hit 着色器不能修改光线本身(原点、方向、 区间只读),也不能调用
TraceRay发射新光线;它能做的是读写光线负载 (payload),并通过IgnoreHit()拒绝命中或AcceptHitAndEndSearch()提前结束遍历。能发射新光线的是光线生成、closest-hit 和 miss 着色器(DirectX Raytracing 功能规范,"Shader types"/"TraceRay" 可调用阶段表;VulkanVK_KHR_ray_tracing_pipeline同理)。 - closest-hit 着色器:与 any-hit 类似,但还能发射新的光线来模拟反射。
- any-hit 着色器:光线上的每一个交点都会调用;可以拒绝该命中,或接受并让测试继续或提前终止,还能修改光线参数。
- 没有击中任何几何的光线调用 miss 着色器,它也能修改光线参数、发射新光线。
混合渲染的典型用法
GPU 光追还不足以支撑完全用光线追踪渲染一个场景所需的数百万条光线,所以通常与光栅化结合:先用传统光栅化把场景渲染进 G-buffer(见 延迟着色),在屏幕空间计算漫反射光照,再对需要镜面高光、反射或间接(反弹)光照的区域发射光线。GEA 把这类引擎称为混合渲染引擎(见 图形栈与渲染引擎架构)。随机光线追踪与路径追踪的原理在 GEA 卷 II 12.6 节展开。
局限:场景要描述两次
- 光栅管线通常把几何描述成 LOD 层级,同一表面按离相机远近用不同表示(见 细节层次);光线追踪需要与 LOD 无关的表示,因为发射光线时离相机的距离无关紧要。
- 目前 TLAS/BLAS 与传统网格数据结构不兼容,想用硬件光追的引擎必须把场景描述两次:一份给光追管线,一份用另一种格式给光栅管线。GEA 说图形程序员希望未来的实现能让两条管线更好地共享几何数据。
特性级别
GEA 表 11.2:硬件光追从特性级别 11_0 起可选,在 12_2 成为必需(Tier 1.1)(见 图形 API 设备、管线状态与资源)。UE5 中硬件光追的启用和用法见 硬件光线追踪与路径追踪器,光追硬件单元的结构见 并行图形架构与排序分类。
取舍
- 好处:能做光栅化难以做好的镜面反射、间接光等效果,且可与光栅管线协同。
- 代价:光线数量受限,只能用于部分效果;加速结构要额外构建和维护,并与光栅用的 LOD 网格数据重复(卷 II 11.4.6.3)。光线追踪本身缓存不友好、难以并行,是它长期没有用于实时渲染的原因(卷 II 11.1.2)。
GEA 第 12 章的补充(卷 II 12.6.5.2、12.9.3)
- 硬件加速结构在内部实现为 BVH,但只暴露 TLAS 和 BLAS 两层。BLAS 通常对应一个或多个 3D 模型,引用整理成 GPU 可用顶点缓冲和索引缓冲的原始三角形数据;模型通过实例化组成场景,例如一个垃圾桶模型在城市场景中实例化 100 次。每个 TLAS 包含多个 BLAS 实例(通常有预定的最大容量),每个实例用变换矩阵定位(卷 II 12.6.5.2)。BVH 本身的原理见 随机光线追踪与路径追踪 和 空间数据结构。
- 静态关卡几何的 TLAS/BLAS 加速结构可以在资产调理阶段离线生成,和 BSP 树、四叉树、八叉树、包围球层次一样(卷 II 12.9.3)。
PBRT 的视角:CPU 端的实例化与两层结构(PBRT 4e 7.1.2)
PBRT 的 CPU 路径没有硬件 TLAS/BLAS,而是用软件实现同样的思想;GPU 路径则直接用光追 API 的加速结构(书中 15.3.6 节)。
| 概念 | 硬件光追(上文) | PBRT CPU 路径 |
|---|---|---|
| 底层结构 | BLAS:三角形几何 | 一个 BVHAggregate(任何 Primitive 集合) |
| 实例 | TLAS 条目:实例 id + 变换 + BLAS 引用 | TransformedPrimitive:变换 + Primitive 指针;运动用 AnimatedPrimitive |
| 顶层 | TLAS | 场景级 BVHAggregate,叶子是实例 |
| 层数 | 固定两层 | 任意嵌套(元层次结构) |
PBRT 的一个设计取舍:被实例化的形状不知道实例变换。若让三角网格知道所有实例变换,它就得为每个实例拷贝一份变换后的顶点,抵消实例化省下的内存。数量级见书中生态场景:内存里 2400 万三角形,经实例化表示 31 亿三角形,约 4 GB 对比 516 GB 以上。BVH 本身的细节见 空间数据结构。
出处
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.4.6.3 节
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.6.5.2、12.9.3 节
- PBRT 4e source excerpt: chapter 07 (Primitives and Intersection Acceleration)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 7 章 7.1.2 节,pbr-book.org/4ed/Primitives_and_Intersection_Acceleration