欢迎光临
我们一直在努力

Building a Simple Engine -- Advanced Topics -- Ray query rendering

光线查询渲染(Ray Query Rendering)

本引擎包含一个基于 Vulkan 光线查询(ray queries) 实现的光线追踪渲染模式。与构建完整的光线追踪管线(光线生成 / 未命中 / 命中着色器,raygen/miss/hit shaders)不同,光线查询允许你从常规着色器中直接执行相交检测。

在本示例中,我们通过计算着色器(compute shader) 调用光线查询来渲染整帧画面,核心流程如下:

  • 构建底层加速结构(BLAS,每个网格对应一个)与顶层加速结构(TLAS,包含场景实例)。
  • 调度计算着色器,该着色器执行以下操作:
    • 从相机为每个像素生成一条主光线(primary ray)。
    • 调用TraceRayInline()检测光线与 TLAS 的相交情况。
    • 使用与光栅化路径相同的 PBR 工具集对相交点进行着色。
  • 将渲染结果写入存储图像(storage image),再合成为交换链图像。
  • 为何选择光线查询?

    光线查询非常适合「混合渲染器」的设计理念,核心优势如下:

  • 可从计算、片段或其他着色器阶段调用。
  • 复用标准的描述符系统,无需额外适配。
  • 着色器代码完全掌控控制流:由开发者决定光线遍历方式、相交判定时机及着色逻辑。
  • 高层级架构

    光线查询模式主要涉及三个核心模块:

  • 加速结构(Acceleration structures):基于场景的顶点缓冲区与索引缓冲区构建。
  • 描述符(Descriptors):绑定 TLAS、输出存储图像,以及着色所需的场景数据。
  • 着色器(Shader):生成光线、执行查询、对相交点着色。
  • 核心设计思路:光线查询着色器并不「独占」场景数据,它与光栅化路径读取相同的场景资源(网格、材质、纹理),但通过为计算路径专门设计的独立描述符集访问这些资源。

    加速结构构建(BLAS/TLAS)

    场景加载完成后,我们会一次性构建加速结构:

  • 为每个唯一网格创建一个BLAS。
  • 将每个场景实例(含自身变换矩阵)添加至TLAS。
  • 每个 TLAS 实例都会编码一个自定义的「实例索引」,着色器可通过该索引查询对应的GeometryInfo表。
  • 光线查询着色器通过实例索引获取以下关键数据:

    • 顶点缓冲区与索引缓冲区的设备地址
    • 材质索引
    • 每个实例的法线变换矩阵(用于计算正确的世界空间法线)

    描述符布局

    光线查询模式使用独立的描述符集布局,绑定编号需与着色器中的定义严格一致,本引擎的典型绑定配置如下:

    表格

    绑定编号绑定内容
    0 光线查询专用的小型 UBO(相机矩阵、曝光 / 伽马值、功能开关)
    1 TLAS(顶层加速结构)
    2 输出存储图像
    3 光源缓冲区
    4 GeometryInfo 缓冲区
    5 材质缓冲区
    6 大容量组合图像采样器数组(作为纹理表)

    兼容流式加载的纹理访问

    本引擎支持纹理的异步流式加载,光线查询模式的核心设计要点是:着色器通过固定大小的数组(纹理表) 索引纹理。

    运行时流程:

  • 材质存储纹理在纹理表中的索引(基础色、法线、金属度 – 粗糙度、遮挡、自发光纹理)。
  • 渲染器会根据当前的纹理句柄刷新纹理表。
  • 纹理表的 0~4 号槽位预留为共享默认纹理(确保采样操作始终有合法的兜底纹理)。
  • 该设计让着色器中的纹理采样逻辑保持简洁:使用NonUniformResourceIndex()进行索引,调用SampleLevel(…, 0.0)采样(显式指定 LOD 对计算着色器至关重要)。

    调度与结果呈现

    光线查询计算着色器将渲染结果写入支持 HDR 的存储图像,调度完成后执行以下步骤:

  • 通过内存屏障将光线查询输出图像的布局从GENERAL(写入)转换为SHADER_READ_ONLY_OPTIMAL(读取)。
  • 执行全屏合成通道,采样输出图像并写入交换链。
  • 最后执行一次布局转换,将交换链准备为呈现状态。
  • 该流程让引擎可复用光栅化与光线查询路径的后处理控制逻辑(曝光 / 伽马校正)。

    代码对应位置

    着色器代码

    shaders/ray_query.slang

    CPU 端光线查询构建与描述符配置

    renderer_ray_query.cpp

    渲染循环集成 + UI 控制

    renderer_rendering.cpp

    描述符索引特性(用于大容量采样器数组)

    renderer_core.cpp

     

    赞(0)
    未经允许不得转载:171主机测评 » Building a Simple Engine -- Advanced Topics -- Ray query rendering
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址