#define LAB_TASK_LEVEL 1
欢迎!在本系列中,我们将为 Vulkan 渲染器添加光线追踪特性,以实现实时像素级阴影(包含和不包含透明度)以及一个额外的反射效果。你将基于提供的脚手架代码(基于 Vulkan 教程)进行开发,并按照分步指导填充关键的着色器函数。
学完本系列后,你将掌握以下技能:
使用 Vulkan 动态渲染(无需预定义渲染通道),并通过 RenderDoc 进行验证。
为光线追踪创建底层和顶层*加速结构*(BLAS 和 TLAS)。
实现基于 Ray Query 的*阴影射线*(先处理全不透明几何体,然后处理带 alpha 测试*透明度*的几何体)。
在 Nsight Graphics 中调试/检查加速结构。
(可选)实现基于 Ray Query 的*反射*。
前置要求: 本系列面向中级 Vulkan 程序员。我们假设你已经完成了基础的 Vulkan 教程(图形管线、描述符集等)。如果尚未完成,你仍可以在概念上跟进。我们提供了一台配备最新 Vulkan SDK(1.4.311)、支持光线追踪的 GPU(Vulkan Ray Query),以及 RenderDoc 和 Nsight Graphics 的 Windows 机器。
移动端最佳实践说明:
我们使用 VK_KHR_dynamic_rendering(Vulkan 1.3 核心功能)替代传统的渲染通道。这不仅简化了 API,而且结合 VK_KHR_dynamic_rendering_local_read 扩展,可以实现类似于子通道的 tile 本地存储读取,这对移动端基于 tile 的 GPU 来说非常重要,有助于节省带宽。
我们在片段着色器中使用 Ray Query(来自 VK_KHR_ray_query),而不是单独的光线追踪管线。在移动端,Ray Query 的支持范围要广泛得多,并且(取决于用例)通常比完整的光线追踪管线更高效。Ray Query 可以很好地融入片段着色流程,利用片上压缩并避免上下文切换。
提供的代码: 提供的代码是一个 Vulkan 渲染器,已经实现了基本的图形管线并使用了动态渲染。它基于 Vulkan 教程,并自包含在单个 C++ 源文件和 Slang 着色器文件中:
如果你在着色器任务中遇到困难,可以参考提供的完整解决方案:38_ray_tracing_complete.slang
源代码的结构旨在引导你逐步完成各个任务,并提供了提示和样板代码。它还设置了所有必需的扩展和功能,包括 VK_KHR_acceleration_structure 和 VK_KHR_ray_query。
你会看到代码中标记有 // TASKxx 的部分,我们将在每一章中引用这些部分。
在 C++ 文件的顶部,请注意以下变量:
#define LAB_TASK_LEVEL 1
在特定阶段,我们会指导你更新此变量并重新构建,以验证关键更改的效果,无需编写新代码。
你可以从 Visual Studio 中构建并运行提供的示例(将 38_ray_tracing 设为启动项目),或者通过命令行:
cmake --build build --target 38_ray_tracing --parallel; start .\build\38_ray_tracing\Debug\38_ray_tracing.exe -wo .\build\38_ray_tracing\
请注意,上述命令与基础教程相比没有变化,你可以像完成教程其余部分一样,继续在其他平台上构建。
下一篇:动态渲染
Vulkan 是 Khronos Group Inc. 的注册商标
教程内容版权归原作者,遵循 CC BY-SA 4.0;本站独立代码及设计除外。