Portable asset paths in project files (project file version 8): splat set, mesh, and HDR environment paths are now stored UTF-8 encoded with forward slashes, relative to the project file when possible and absolute when the resource lives on a different drive or network share. Projects saved on Windows previously stored backslashes, which made them fail to load on Linux — including the shipped sample projects as soon as they were re-saved. Projects up to version 7 are still read, with their native separators converted on load. Also fixes relative paths being emitted as a nonsensical .. chain when the asset was on a different drive than the project.
Single-splat-set payload reduction: RTX_HAS_PARTICLES now encodes the clamped RTX splat descriptor count (0 = no particle code, 1 = single set, 2 = multi-set). With a single splat set (one instance, no BLAS chunk split), the per-sample splatSetIdx[] array and currentSplatSetInstance are removed from the ray payload (descriptor index 0 implied), reducing payload size by PARTICLES_SPP + 1 dwords and lowering register pressure across TraceRay(). Shader recompilation triggers automatically when the mode changes (e.g. a second set is added).
Stochastic any-hit payload/ALU reduction: the any-hit now evaluates opacity only (threedgrtProcessHit gained a kRadiance template flag); the SH radiance fetch and the normal (surface-info gated, previously always computed) run once per ray in the raygen for the surviving sample instead of once per candidate hit. The per-sample color[]/normal[] payload fields are removed (7 dwords), and the stochastic shadow path simplifies to binary occlusion (semantically identical to the previous constant-alpha averaging).
Wireframe is disabled with stochastic trace strategies in the RTX pipeline, where it is unsupported. The checkbox is greyed out with an explanatory tooltip and the setting is preserved, so it reapplies when the strategy or pipeline changes.
Fixed splat materials being taken from the wrong splat set in raster and hybrid with lighting enabled. In front-to-back mode the per-pixel splat ID was written by every fragment to a colour attachment that cannot blend and has no depth test to arbitrate, so the farthest splat won instead of the reconstructed surface splat — with multiple splat sets, all of them were shaded using the backmost set's material. The ID is now written in the same interlocked block as the depth pick. Ray tracing was unaffected.
Fixed the build with -DUSE_DLSS=OFF, for environments without the NVIDIA NGX SDK. Note that the default -DUSE_DLSS=ON build also runs on non-NVIDIA hardware such as AMD/RADV — DLSS is simply auto-disabled at runtime.
Guarded --saveImage issued before the first rendered frame in headless mode.
Skip two redundant shader compilations at startup and shutdown.
Fixed the splat global-offset table being keyed by rendering order instead of descriptor index, which gave wrong global splat IDs to instances following a hidden one (affects picking and ray-hit profiling only, not rendering).
Bounding modes for TLAS instance scale: Uniform (½, ⅓, ¼), Fitted, Optimal (per-particle), AABB max opacity, icosahedron ellipsoid; default bounding mode is now Uniform ½ (adaptive bounding modes were removed after evaluation).
RTX_SHORTEN_RAY option for stochastic any-hit early termination; billboard depth available for all trace strategies.
Other RTX Fixes: multi–splat-set compositing, light leak, depth incompatibilities, large BLAS build path for bounding modes.
Samples folder with build script for downloading external assets; new and updated sample projects (large city with sky, chessboard winter garden, winter garden on stove scene, and others).
Mesh asset download moved from CMake to the samples build script.