7.1 光线追踪


文档摘要

7.1 光线追踪 本节摘要:Vulkan 的光追由加速结构、光追管线与回调表三件套组成:几何压进两级 BVH,管线带三族新着色器,回调表决定射线命中后调用谁。本节按「构建、装配、发射」的顺序走通最小链路,并交代混合渲染下的同步要点与工程代价。 「Ray tracing」在图形行话里专指硬光追——由硬件求交单元执行、按射线逐次调度的可见性计算。它与离线渲染里的路径追踪是同源思想在实时层的实现;本节聚焦 Vulkan 的硬件光追接口:2018 年由厂商扩展起步(NV、AMD 各自为政),2020 年统一为 VKKHRraytracingpipeline 与 VKKHRaccelerationstructure,2022 年起新增了内存需求查询等维护性修订。

7.1 光线追踪

本节摘要:Vulkan 的光追由加速结构、光追管线与回调表三件套组成:几何压进两级 BVH,管线带三族新着色器,回调表决定射线命中后调用谁。本节按「构建、装配、发射」的顺序走通最小链路,并交代混合渲染下的同步要点与工程代价。

「Ray tracing」在图形行话里专指硬光追——由硬件求交单元执行、按射线逐次调度的可见性计算。它与离线渲染里的路径追踪是同源思想在实时层的实现;本节聚焦 Vulkan 的硬件光追接口:2018 年由厂商扩展起步(NV、AMD 各自为政),2020 年统一为 VK_KHR_ray_tracing_pipeline 与 VK_KHR_acceleration_structure,2022 年起新增了内存需求查询等维护性修订。

一、加速结构:把场景压进 BVH

加速结构(acceleration structure)是把几何组织成层次包围盒的数据结构,分两级:底层(BLAS)装一个网格资产的三角形与变换;顶层(TLAS)装实例(引用底层加各自的变换矩阵)。两级划分的意义是更新成本分层——角色动了只重建(更新)顶层,几何本身不动就不碰底层。

// 底层:先查内存需求(两段式查询,构建与更新所需可能不同) VkAccelerationStructureGeometryKHR geom = {VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR}; geom.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR; geom.geometry.triangles = triData; // 顶点与索引的设备地址(需 SHADER_DEVICE_ADDRESS 用法) VkAccelerationStructureBuildGeometryInfoKHR build = {VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR}; build.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; build.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR; build.pGeometries = &geom; build.geometryCount = 1; VkAccelerationStructureBuildSizesInfoKHR sizes = {VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR}; vkGetAccelerationStructureBuildSizesKHR(device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &build, &primCount, &sizes); // 据此分配结果缓冲与 scratch 缓冲,再用 vkCmdBuildAccelerationStructuresKHR 构建

注意三个细节:几何数据以设备地址引用(缓冲要开 SHADER_DEVICE_ADDRESS 用法位,3.2 的表格里埋过伏笔);构建分两步——先查尺寸再分配后构建,尺寸查询以最大图元数为准一次到位;scratch 是构建用的临时工作区,多级结构间可复用以省显存。

二、光追管线与回调表

光追管线的着色器分三族:射线生成(raygen,每像素或每tile发射的起点)、命中组(closest-hit、any-hit,命中后着色或做透明处理)、未命中(miss,打到天光或背景)。另有可调用着色器与相交着色器用于解析几何。装配入口是 vkCreateRayTracingPipelinesKHR,结构与图形管线类似但状态简单得多。

与图形管线对照着记:光追管线没有顶点输入、没有光栅化状态,取而代之的是最大递归深度声明与回调表布局的约束;着色器之间传递数据靠 rays 载荷结构(每条射线一份),而不是插值的 varying。首次装配建议从「一条主射线加最近命中」的最小集开始,跑通后再逐层加透明处理与二次弹射——管线族的每员都参与回调表布局,一次到位式的开发调试成本极高。

图 7-1:光追管线与回调表的装配关系

图 7-1:光追管线与回调表的装配关系

放到整章视角看:光追管线没有顶点输入、没有光栅化状态,取而代之的是最大递归深度声明与回调表布局的约束;着色器之间传递数据靠射线载荷结构(每条射线一份),而不是插值的 varying。首次装配建议从「一条主射线加最近命中」的最小集开始,跑通后再逐层加透明处理与二次弹射——管线族的每员都参与回调表布局,一次到位式的开发调试成本极高。

回调表(shader binding table,业内口语 SBT)是光追最特别的手续:一块缓冲,按「射线生成、命中、未命中」分区,每条记录写着色器句柄加自定义数据。射线的调用路径由它定义——发射时给射线生成区的偏移,命中时按几何与实例携带的索引跳进命中区。SPIR-V 侧用 shaderRecord 布局读取自定义数据(材质索引等)。

// 发射(在命令缓冲内,通常位于计算或图形通道之后) vkCmdBindRayTracingPipelineKHR(cmd, rtPipeline); vkCmdTraceRaysKHR(cmd, &raygenRegion, &missRegion, &hitRegion, &callRegion, width, height, 1);

回调表的装配有三个工程细节。条目对齐:每个记录的地址对齐按 shaderGroupHandleAlignment 查询(常见 32 或 64 字节),句柄尺寸由 vkGetRayTracingShaderGroupHandlesKHR 给出,手动拼表时对齐算错是最常见的崩点。分区基址:四个区各自有基址与步长,把命中区步长设为「命中组记录大小」而未对齐,会随机读到下一组的句柄。实例携带索引:TLAS 实例与底层几何各带一组命中索引,与回调表的命中区布局要成对设计——材质数量变化时改表的往往是索引方案而非表本体,这是 SBT 设计里最值得先画草图的部分。

三、混合渲染与同步要点

多数项目不用纯光追管线渲染整帧,而是「光栅化主帧加光追特效(阴影、反射、全局光照探针)」的混合架构。同步上多出两类手续:其一,追踪命令消费 G 值缓冲(位置、法线),光栅段写入与光追段读取之间要屏障连线(第 6 章的合同照填);其二,加速结构的更新(TLAS 每帧重建很常见)与追踪命令之间是设备侧依赖,用屏障的 ACCELERATION_STRUCTURE_READ/WRITE 访问位声明——这是光追特有的访问类别。

调试增益也不该漏掉:光追管线支持与图形管线同源的调试命名(第 8 章),但 RenderDoc 对光追的支持在捕获粒度上有限,实践里更依赖验证层加自定义可视化(把射线命中深度可视化成颜色是排错利器)。

四、案例:预览级光追的接入评估

背景:场景编辑器想加光追预览(软阴影与镜面反射),要求在中端独显上实时,且低端设备不能崩溃。

操作:评估先行。能力探测覆盖光追管线、加速结构、管级缓冲地址三个扩展及其特性位,不齐的设备走分级方案。工程上按最小链路接入:场景网格按静态与动态分池建底层(静态构建一次,动态每帧更新顶层),射线生成着色器对每个像素发一条主射线求最近命中,命中后查软阴影与一次镜面弹射;效果分辨率减半再上采样。同步按混合架构手续办理,G 值与加速结构屏障齐备。

结果:中端卡上半分辨率效果稳定跑进帧预算;无光追能力的设备自动落在「光栅化近似」档位,编辑器三种画质档位覆盖全硬件。接入总工时约三周,其中调试与同步占三分之一。

解读:这个案例的可行性与两个判断直接相关:效果定位在「预览」而非「电影级」(射线数极省),几何规模是编辑器级而非开放世界级(顶层重建便宜)。光追的成本模型以「每像素射线数乘场景遍历成本」为纲,评估先算这笔账再写代码。

变式:用计算管线加 VK_KHR_ray_query(查询式光追)能以更低侵入实现同一效果——不建光追管线,在现有着色器里发起查询。代价是错过硬件调度的部分收益,好处是着色器架构不变。两者共享加速结构,切换成本不高。

五、要点回顾

  • 三件套结构:两级加速结构管几何、光追管线管着色器族、回调表管调用路径。
  • 两段式构建:先查尺寸再分配构建,scratch 可复用,顶层每帧更新是常态。
  • 混合架构的手续:G 值与加速结构两类屏障,访问位有光追专有类别。
  • 成本模型先行:射线数乘遍历成本定可行性,效果档位与分辨率是第一杠杆。
  • 查询式替代:ray_query 让现有管线低成本获得求交能力,与管线式共享加速结构。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U