• Chat Analysis — Godot NVPathtracer Discussion

    • Notes extracted from the actual Godot Contributors NVPathtracer chat discussion.
    • Parent: PathTracer Learning

  • Key Contributors and Context

    • This was a technical discussion among Godot engine contributors
    • Topic: integrating NVIDIA’s path tracer (NVPathtracer) into Godot 4
    • Challenges discussed: engine integration, performance, API design

  • Technical Insights from the Chat

    • TLAS rebuild strategy
      • Contributors debated full rebuild vs incremental update every frame
      • Full rebuild: simpler, always correct BVH quality
      • Incremental update: faster but BVH quality degrades over time
      • Decision: full rebuild for correctness, optimize later
    • Material system design
      • How to pass PBR material data (albedo, roughness, metallic, textures) to RT shaders
      • Solution: per-instance data buffer indexed by gl_InstanceCustomIndexEXT
      • Each instance stores: vertex buffer address, index buffer address, material index
      • Material buffer stores: albedo, roughness, metallic, texture indices
    • Denoising approach
      • Initial: simple temporal accumulation (free, no extra cost)
      • Target: DLSS 3.5 Ray Reconstruction for final quality
      • Intermediate: OIDN for platforms without DLSS
    • Skinned mesh handling
      • Skinned meshes need BLAS rebuild every frame
      • Use ALLOW_UPDATE flag for incremental BLAS update
      • Separate “dynamic” and “static” BLAS pools
    • Async compute for BLAS builds

  • Architecture Decisions

    • Engine fork vs GDExtension
      • NVPathtracer is an engine fork — modifies core rendering code
      • GDExtension cannot access RenderingDevice internals
      • Future goal: expose RT hooks via GDExtension API
    • Integration point
      • Override _render_scene() in RendererSceneRenderRD
      • Skip rasterization entirely for path-traced frames
      • Keep shadow maps for hybrid rendering (raster + RT)
    • Buffer management
      • Reuse Godot’s existing depth/normal/motion buffers
      • Add new accumulation buffer and albedo buffer for denoiser
      • Use RenderSceneBuffersRD to manage lifetime

  • Open Questions from the Chat

    • How to handle transparent objects (glass, water)?
      • RT handles refraction naturally — just trace through
      • Need to disable alpha blending for RT objects
    • LOD (Level of Detail) with RT?
      • RT doesn’t use rasterization LOD system
      • Need separate LOD selection for BLAS geometry
    • Emissive materials as light sources?
      • NEE needs to know which instances are emissive
      • Build a light list from emissive instances for NEE sampling

  • Lessons Learned

    • Start simple: temporal accumulation before DLSS
    • Get correctness first: full TLAS rebuild before optimization
    • Test with Cornell box: known ground truth for validation
    • Profile early: GPU timing for each pass (BLAS, TLAS, RT, denoise)