光线查询渲染(Ray Query Rendering)
本引擎包含一个基于 Vulkan 光线查询(ray queries) 实现的光线追踪渲染模式。与构建完整的光线追踪管线(光线生成 / 未命中 / 命中着色器,raygen/miss/hit shaders)不同,光线查询允许你从常规着色器中直接执行相交检测。
在本示例中,我们通过计算着色器(compute shader) 调用光线查询来渲染整帧画面,核心流程如下:
- 从相机为每个像素生成一条主光线(primary ray)。
- 调用TraceRayInline()检测光线与 TLAS 的相交情况。
- 使用与光栅化路径相同的 PBR 工具集对相交点进行着色。
为何选择光线查询?
光线查询非常适合「混合渲染器」的设计理念,核心优势如下:
高层级架构
光线查询模式主要涉及三个核心模块:
核心设计思路:光线查询着色器并不「独占」场景数据,它与光栅化路径读取相同的场景资源(网格、材质、纹理),但通过为计算路径专门设计的独立描述符集访问这些资源。
加速结构构建(BLAS/TLAS)
场景加载完成后,我们会一次性构建加速结构:
光线查询着色器通过实例索引获取以下关键数据:
- 顶点缓冲区与索引缓冲区的设备地址
- 材质索引
- 每个实例的法线变换矩阵(用于计算正确的世界空间法线)
描述符布局
光线查询模式使用独立的描述符集布局,绑定编号需与着色器中的定义严格一致,本引擎的典型绑定配置如下:
表格
| 0 | 光线查询专用的小型 UBO(相机矩阵、曝光 / 伽马值、功能开关) |
| 1 | TLAS(顶层加速结构) |
| 2 | 输出存储图像 |
| 3 | 光源缓冲区 |
| 4 | GeometryInfo 缓冲区 |
| 5 | 材质缓冲区 |
| 6 | 大容量组合图像采样器数组(作为纹理表) |
兼容流式加载的纹理访问
本引擎支持纹理的异步流式加载,光线查询模式的核心设计要点是:着色器通过固定大小的数组(纹理表) 索引纹理。
运行时流程:
该设计让着色器中的纹理采样逻辑保持简洁:使用NonUniformResourceIndex()进行索引,调用SampleLevel(…, 0.0)采样(显式指定 LOD 对计算着色器至关重要)。
调度与结果呈现
光线查询计算着色器将渲染结果写入支持 HDR 的存储图像,调度完成后执行以下步骤:
该流程让引擎可复用光栅化与光线查询路径的后处理控制逻辑(曝光 / 伽马校正)。
代码对应位置
着色器代码
shaders/ray_query.slang
CPU 端光线查询构建与描述符配置
renderer_ray_query.cpp
渲染循环集成 + UI 控制
renderer_rendering.cpp
描述符索引特性(用于大容量采样器数组)
renderer_core.cpp




