Foundation 施工笔记 【6】- 路径追踪
Preface Foundation现在(2025/12/16)也有了能用的RT相关API,Editor的GPUScene也有了BLAS上传/压缩(compact)与逐帧TLAS更新支持。到目前为止用rt做的只有inline query实现硬阴影——在做实时GI相关内容之前,不妨复习下采样/PBR相关知识——那就写个GPU Path Tracer吧? PBRT/Physically Based Rendering:From Theory To Implementation/Kanition大佬v3翻译版,Ray Tracing Gems 2, nvpro-samples/vk_gltf_renderer 将是我们这里主要的信息来源。 准备工作 SBT (Shader Binding Table) 及管线 API 之前用过了非常方便的Inline Ray Query - 从fragment/pixel,compute可以直接产生光线进行trace:从这里出发进行PT是可行的,这也是nvpro-samples/vk_mini_path_tracer 的教学式做法。 不过完全利用硬件的RT管线会离不开SBT/Shader Binding Table,即Shader绑定表。除了shader单体更小更快之外,调度也有由驱动优化的可能。 实现上…初见确实给了不少震撼。庆幸自己选择了去写个RHI,不然Vulkan SBT方面API的繁文缛节实在是难受- - 保持不特化shader(即shader内各种魔法宏 - 点名Unity,UE)的原则,以下是最后实践的shader绑定API。此外,整个路径追踪过程的C++部分也在此一览无余。 renderer->CreatePass( "Trace", RHIDeviceQueueType::Graphics, 0u, [=](PassHandle self, Renderer* r) { r->BindBufferUniform(self, GlobalUBO, RHIPipelineStageBits::RayTracingShader, "globalParams"); r->BindAccelerationStructureSRV(self, TLAS, RHIPipelineStageBits::RayTracingShader, "AS"); r->BindShader(self, RHIShaderStageBits::RayGeneration, "RayGeneration", "data/shaders/ERTPathTracer.spv", AsBytes(AsSpan(cfg.viewFlags))); r->BindShader(self, RHIShaderStageBits::RayClosestHit, "RayClosestHit", "data/shaders/ERTPathTracer.spv", AsBytes(AsSpan(cfg.viewFlags)), /*hit group*/ 0); r->BindShader(self, RHIShaderStageBits::RayAnyHit, "RayOpacityAnyHit", "data/shaders/ERTPathTracer....