Bindless Raytracing Advanced 示例

该示例演示如何将无绑定渲染与光线追踪结合使用,在实时 3D 场景中生成光线追踪阴影和反射。

要求

  • Vulkan 1.2 或更高版本,并启用以下设备扩展:

    • VK_KHR_acceleration_structure

    • VK_KHR_ray_query

    • VK_KHR_buffer_device_address

获取示例

要获取该示例,请在 Kanzi Studio Quick Start 窗口中点击 Examples。在 BindlessRaytracingAdvanced 示例旁边,点击 下载。

Kanzi Studio 会将该示例下载到 <KanziWorkspace>/Examples/BindlessRaytracingAdvanced 目录。

示例内容

该示例展示了 Kanzi 当前支持的光线追踪阴影和反射功能,二者均利用了无绑定渲染功能。场景中的植物演示了支持 alpha 的 GBuffer 和光线追踪。借助无绑定渲染,遮罩几何体能够被正确捕获到 GBuffer 中,并参与阴影光线和反射光线的计算,而无需单独的渲染通道。所提供的着色器兼容 PBR,并有意保持简化。

设置使用光线追踪或无绑定渲染的工程

备注

光线追踪和无绑定渲染是实验性功能。它们可能会在未来的版本中更改或移除。

要在您自己的工程中启用光线追踪或无绑定渲染:

  1. 打开工程,并在主菜单中选择 Project > Properties。

  2. 在 Properties 中展开 Preview 类别,并将 Preview Graphics API Configuration 设置为 Vulkan。

    ../../_images/properties-preview.png
  3. 在 Properties 中展开 Profile 类别,并将 Target Graphics API 设置为 Vulkan 1.2。

    ../../_images/properties-target-graphics-api.png

运行示例

在 Kanzi Studio 中打开该示例。当主机 GPU 满足上述要求时,Preview 会使用光线追踪阴影和反射渲染场景。

如果 GPU 或驱动程序不满足 Vulkan 1.2 要求或不支持光线追踪,Kanzi 会跳过不受支持的功能。

技术细节

渲染通道预设件

该示例在默认渲染通道预设件的基础上扩展了几个附加通道:

  • Build Acceleration Structure — 根据场景几何体构建底层和顶层加速结构。此通道必须在发出任何光线查询之前运行。

  • Raytraced Shadows — 一个计算通道,从每个 GBuffer 片段向指定光源追踪阴影光线,并将结果写入阴影渲染目标。该示例提供了 RaytracedShadowsMaterial 计算材质,作为可直接使用的起点。随后在光照通道中对阴影纹理进行采样,以衰减直接光照的贡献。

  • Raytraced Reflections — 一个计算通道,从 GBuffer 表面法线追踪反射光线,以渲染反射纹理。在光栅化通道中,可以将生成的纹理混合到最终图像中。

光线追踪阴影通道和光线追踪反射通道都必须放在渲染通道层级中的 Gather Lights 渲染通道之下。这样可确保它们能够访问 Gather Lights 收集的光源数据,并能为场景中所有活动光源正确计算阴影和反射。

这两个通道在运行之前还需要先向 GBuffer 填充深度、法线和粗糙度数据。速度数据是可选的,用于阴影降噪器。该示例使用无绑定渲染,因此 GBuffer 能够感知 alpha。植物等遮罩几何体会被正确捕获到 GBuffer 中,并参与阴影光线和反射光线的计算,从而生成准确的轮廓,而无需为 alpha 测试几何体单独设置渲染通道。

所提供的着色器兼容 PBR,并有意保持简化。您可以对其进行深度优化,并根据工程的具体需求进行调整。

无绑定

共享的无绑定基础设施位于 <kanzi/bindless/common.glsl> 中。它声明了以下结构体和工具,任何包含该文件的着色器都可以使用:

  • kzGPUSceneMeshInfo — 每个网格顶点流的设备地址:位置、法线、切线、UV 和索引。

  • kzGPUSceneInstanceInfo — 每个实例的世界/对象变换、索引偏移以及材质 ID 和网格 ID。

  • kzGPUSceneInfo — 指向网格、实例和材质信息数组的顶层指针。

  • kzGPUSceneTextures2D — 无绑定 2D 纹理数组,通过材质结构体中存储的纹理 ID 进行索引。

  • 辅助函数 fetchPosition、fetchNormal、fetchTangent、fetchUV — 带类型的访问函数,可透明地处理 float32 和 float16 顶点数据。

有关实际用法示例,请参阅该示例 Shaders/ 目录中的着色器:RaytracingUtils.glsl、GBufferVelocity.frag.glsl、RaytracedShadows.comp.glsl 和 RaytracedReflections.comp.glsl。

kzGPUSceneMaterialInfo 是 BindlessMaterialDefinition.glsl 中用户定义的着色器结构体,您可以自由修改它,以包含工程所需的任何材质属性。它指定将哪些材质数据打包到无绑定缓冲区中。kzGPUSceneMaterialInfo 中的字段名称必须与相应的材质属性名称完全一致。如果名称不一致,无绑定更新将无法找到该属性,Kanzi 会将该字段置零。目前每个工程仅支持一个 kzGPUSceneMaterialInfo 定义。