Splats in three.js, Babylon and beyond
Outside PlayCanvas and Babylon.js, browser splat rendering was a third-party library ecosystem until three.js added its own renderer in September 2026, and that ecosystem consolidated hard through 2025: the two libraries most tutorials still point at are frozen, and both now redirect readers to the same successor. Knowing which projects are actually alive in 2026 matters more here than in most tooling choices, because a splat renderer sits close enough to the engine internals that an abandoned one decays quickly.
The two pioneers, now frozen
antimatter15/splat (MIT) is the original standalone WebGL viewer from
2023, the project that established the CPU-sort-in-a-worker
architecture everything else copied. Its last commit, in November
2025, exists to add a README recommendation to use Spark instead.
mkkellogg/GaussianSplats3D (MIT) was the standard three.js splat
library for roughly two years, with a WASM-accelerated sort worker and
support for .ply, .splat and its own .ksplat format; its last
release, v0.4.7, shipped in January 2025, and its README now states
the project is no longer in active development and also points to
Spark. Both still work for what they already do, but neither is going
to track three.js releases or fix what breaks next.
Spark: where the three.js ecosystem landed
Spark (sparkjsdev/spark, MIT, maintained under the World Labs
organisation) is an advanced Gaussian splatA single anisotropic 3D Gaussian, an ellipsoid with position, covariance, opacity and view-dependent colour, used as the basic rendering primitive of a splat scene. Millions of these together, optimised against training images, make up the scene. renderer built for
three.js, and it is unambiguously alive: v2.1.0 shipped in May 2026
and commits continue into July. It is not an official three.js
package, and that’s worth being clear-eyed about, since its future
depends on one company’s continued interest rather than the three.js
project itself; but with both pioneer libraries explicitly deferring
to it, it is the de facto default for new three.js splat work in
2026. For a
react-three-fiber project that means wiring Spark in directly; drei
does ship a <Splat> component, but it wraps the antimatter15-lineage
renderer internally, which makes it fine for a quick demo and a poor
representation of the current state of the art.
three.js r186: a built-in renderer
three.js r186, released on 24 September 2026, ships the project’s own
splat renderer as an addon: a TSL implementation that runs on both
WebGPU and WebGL, with loaders for .ply, .splat, .spz (including
SPZ version 4) and .ksplat, plus glTF import through the
KHR_gaussian_splatting extension with view-dependent colour from
spherical harmonics. The same release added per-mesh bounding boxes,
frustum culling and raycasting, and renamed the class from
GaussianSplatMesh to GaussianSplat, so code written against the
pre-release examples needs updating. There is no SOG loader, so a
scene prepared for PlayCanvas delivery needs an SPZ or glTF export to
load here. The addon has no streaming or LOD, which is still where
Spark is ahead.
Babylon.js: the strongest first-party alternative
Babylon.js is the one engine besides PlayCanvas with genuine
first-party splat support, and it has been shipping steadily:
GaussianSplattingMesh arrived as native scene geometry in v7 (2024),
v8 in March 2025 added SPZNiantic's open, MIT-licensed compressed splat format: roughly a tenth the size of the equivalent raw PLY through per-attribute quantisation and parallel entropy coding, while keeping full spherical-harmonics detail per Gaussian rather than collapsing it into a shared palette. and compressed PLY loading, and v9 in
March 2026 added SOG support. The engine is Apache-2.0, releases
land roughly weekly (v9.15.0 on 2 July 2026), and splat features
appear in mainline release notes rather than a satellite repo, which
is the healthiest possible signal a feature can send. A team already
on Babylon has no reason to look elsewhere: it reads the same
delivery formats this pipeline produces, SOG included, so a scene
prepared for PlayCanvas delivery loads there without a conversion
step.
The rest of the field
gsplat.js (huggingface/gsplat.js, MIT) is an engine-agnostic splat
library with its own worker-based sorting; its last release, v1.2.9,
shipped in July 2025, with only occasional commits since. Not dead,
but dormant, and not where new work should start. Luma AI’s web
library (@lumaai/luma-web, the LumaSplatsThree renderer) is
effectively abandoned: its examples repository was archived in April
2025 and the library itself has had no substantive updates since early
2024. It mattered historically as the first polished commercial
three.js integration; it is not a 2026 option.
In practice
Starting a three.js or react-three-fiber splat project today, the answer now depends on scene size. For a single embed that loads whole, the built-in r186 addon avoids a third-party dependency and follows three.js releases by definition. For large scenes that need streaming or LOD, Spark remains the choice, and the two libraries a 2024-era tutorial will recommend both point there themselves. A Babylon shop should use the native support and nothing else. And the general habit worth keeping: check the commit history of any splat library before adopting it, because this corner of the ecosystem turned over almost completely between 2024 and 2026, and the search results have not caught up.
Changelog
- — Added three.js r186's built-in Gaussian splat renderer and loaders, and revised the three.js recommendation to split between the built-in addon and Spark. (2026-W39)
Related papers
3D Gaussian Splatting for Real-Time Radiance Field Rendering
The founding paper: real-time radiance fields via rasterised anisotropic Gaussians instead of ray-marched MLPs.