
vis.gl has published @luma.gl/splats, an experimental GPU-native gaussian splat rendering module, to npm as a 9.4.0 beta.
luma.gl is the WebGL and WebGPU rendering library that deck.gl is built on. This is not related to the cloud based reconstruction platform, Luma AI. The modules/splats directory first landed in on 4 August 2026, and the package reached npm on 21 August as 9.4.0-beta.1, followed by 9.4.0-beta.2 roughly two hours later. Both GitHub releases are tagged prerelease, and the stable luma.gl line remains 9.3.6.
The module owns prepared splat data, directional spherical harmonics, semantic filtering, GPU picking, hierarchy traversal, bounded residency, covariance projection, depth ordering and render models without depending on Apache Arrow, loaders.gl, glTF packages or deck.gl. The graph renderer, GPU ordering, hierarchy traversal and storage backed features require WebGPU, and SplatRenderer's prepared path is the WebGL 2 fallback.
makeGPUSplatDataFromGLTF and loadGPUSplatDataFromGLTF consume decoded glTF primitives declaring KHR_gaussian_splatting, validating POINTS primitives, ellipse kernel, color space, projection and sorting method, converting glTF XYZW quaternions to renderer WXYZ order, and packing degree one through degree three RGB coefficient bands. Authored EXT_mesh_features identifiers become stable source semantic IDs. Compressed KHR_gaussian_splatting_compression_spz_2 payloads go to a caller owned decoder, and the documentation states that the renderer does not parse SPZ or fetch 3D Tiles itself. three.js merged its own native splat renderer for r186 and subsequently added SH support.
SplatResidencyManager budgets on maxGpuBytes, maxResidentSplats and maxResidentChunks, displaces lower priority chunks before falling back to least recently used eviction, supports pinning, and never repacks or concatenates GPU buffers. SplatHierarchyManager exposes maximumScreenSpaceError, maxConcurrentLoads and a foveation center, radius and strength, culls bounding spheres conservatively, and cancels requests that leave the current view. SplatRADHierarchyManager and GPUPagedSplatRenderer implement Spark's RAD row-level hierarchies at a pageSize of 65,536, preserving page-local childCounts and source-global childStarts alongside lodSplatScale, lodRenderScale, lodOpacity and coneFov0 controls.
The interactive viewer streams the 750K train capture, with Truck, Dr Johnson and Playroom in the same catalog, and the showcase reads ply, splat, ksplat, spz and rad. Its default residency window retains at most one million original source rows, tunable through a residentSplats URL parameter. RAD chunk decoding runs in a bounded module-worker pool that serializes to transferable Arrow IPC, with an explicit main-thread fallback.
End to end Gaussian 3D Tiles are not finished. The missing pieces are currently the loader owned KHR runtime handlers, SPZ v2 decoding and per-page model transforms, where Gaussian splat 3D Tiles carry an XL cost estimate on the watch list.
@luma.gl/splats is MIT licensed and open source. It installs with yarn add @luma.gl/splats.
New to Gaussian Splatting? Start here






