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目前还没有SBT相关设施,借此一并处理。参考 nvpro-samples/vk_raytracing_tutorial_KHR …SBT API应该是Vulkan中最无语的一个设计了。在RHI里决定偷懒,在光追PSO创建过程中直接处理并分组SBT;最后实现完整PT所需的Renderer使用会很轻松,如下: ... renderer->CreatePass( "Trace", RHIDeviceQueueType::Graphics, 0u, [=](PassHandle self, Renderer* r) { r->BindBackbufferUAV(self, 1u); r->BindBufferUniform(self, GlobalUBO, RHIPipelineStageBits::RayTracingShader, "globalParams"); r->BindAccelerationStructureSRV(self, TLAS, RHIPipelineStageBits::RayTracingShader, "AS"); r->BindShader(self, RHIShaderStageBits::RayGeneration, "RayGeneration", "data/shaders/ERTPathTracer.spv"); r->BindShader(self, RHIShaderStageBits::RayClosestHit, "RayClosestHit", "data/shaders/ERTPathTracer.spv"); r->BindShader(self, RHIShaderStageBits::RayMiss, "RayMiss", "data/shaders/ERTPathTracer.spv"); r->BindBufferStorageRead(self, InstanceBuffer, RHIPipelineStageBits::ComputeShader, "instances"); r->BindBufferStorageRead(self, PrimitiveBuffer, RHIPipelineStageBits::AllGraphics, "primitives"); r->BindBufferStorageRead(self, MaterialBuffer, RHIPipelineStageBits::AllGraphics, "materials"); r->BindTextureSampler(self, TexSampler, "textureSampler"); r->BindDescriptorSet(self, "textures", gpu->GetTexturePool()->GetDescriptorSetLayout()); }, [=](PassHandle self, Renderer* r, RHICommandList* cmd) { RHIExtent2D wh = r->GetSwapchainExtent(); r->CmdSetPipeline(self, cmd); r->CmdBindDescriptorSet(self, cmd, "textures", gpu->GetTexturePool()->GetDescriptorSet()); cmd->TraceRays(wh....