
When World Labs previewed Spark 2.0 earlier this year, the headline capabilities were the radiance field file type (.RAD), a Level-of-Detail system, and GPU memory paging that could make massive 3DGS scenes run on mobile hardware. Today, World Labs is officially rolling out Spark V 2.0 and it comes with several advancements for engineers and creators to leverage.
Spark has come a long way since its early days, World Labs' internal renderer that grew into an open-source THREE.js library recognized by GitHub as one of 2025's most influential repositories. The v0.1.x releases established the foundation of global splat sorting across multiple 3DGS objects, a programmable GPU pipeline for relighting and animation, and WebGL2 compatibility across every device. Spark 2.0 keeps all of that but adds the infrastructure to scale it to scenes that are orders of magnitude larger.
Spark 2.0 features a continuous LoD system built around what the team calls an LoD splat tree. Every splat in a scene exists as a leaf node in a hierarchy where each parent is a merged, lower-resolution version of its children, all the way up to a single root splat representing the entire scene's aggregate shape and color. Rather than swapping between discrete resolution levels, which causes visible popping and tile boundaries, Spark computes a "slice" through this tree that picks the best set of splats for the current viewpoint within a fixed budget. Set that budget to 500K splats on a phone or 2.5M on a desktop, and you get a steady frame rate regardless of how many splats exist in the world. The traversal itself runs in Rust compiled to WebAssembly, operating in a background Web Worker so LoD updates never block the render loop.
Two algorithms generate these trees. Tiny-LoD is designed for on-demand use in the browser. It divides space into a grid hierarchy, merges splats that share a grid cell at each level, and walks up to the root. A memory optimization borrowed from computational genomics replaces hash maps with sorted arrays for better cache locality. The default grid ratio is 1.5 rather than the octree-standard 2.0, which produces more irregular grid boundaries between levels and smoother detail transitions. Bhatt-LoD is the higher-quality offline option, pairing splats for merging based on the Bhattacharyya distance between their 3D Gaussian density functions and color similarity. It always merges pairs, so N input splats produce exactly N-1 interior nodes, then prunes any parent that isn't meaningfully larger than its children. Both algorithms are training-free, so no reference images needed.
To actually stream these trees over the web, World Labs built a new file format, which I was personally excited to see, the radiance field format, .RAD. PLY files are row oriented and can be loaded progressively, but they're uncompressed and enormous. SPZ files compress well by storing data in column order, but you can't display anything until the entire file arrives. RAD organizes splats into 64K chunks, each stored in column order with per-property encoding precision and Gzip compression, all randomly seekable via byte offsets in a JSON header. The first chunk always contains the scene's 64K largest splats, so a coarse version appears almost instantly. Subsequent chunks are spatially partitioned and fetched based on what the camera is looking at, with three parallel Web Workers handling download and decode in the background.
The third piece is a virtual memory system that adapts OS-style paging to splats. Spark pre-allocates a fixed 16M-splat GPU pool and manages it as a page table of 64K-splat pages. Pages load in based on LoD traversal priority and evict on a least-recently-used basis when the pool is full. Multiple .RAD files share the same page table, so composite worlds built from many 3DGS objects, the kind Marble generates, get a unified global priority ordering across all files and chunks. The LoD traversal handles this natively too, starting with root nodes from every object in a shared priority queue and refining whichever splats are coarsest on screen, regardless of which file they came from.
Foveated rendering adds one more layer. Spark biases the splat budget toward the center of the view direction using a scaling factor that adjusts each splat's apparent screen size during traversal. Splats in your line of sight get refined to full resolution; splats at the periphery and behind the camera resolve at a fraction of the detail. Four parameters control the falloff. The full-resolution cone angle, the foveation cone angle, the edge foveation scale, and the behind-camera foveation. It's fixed foveation, not eye-tracked, but within a budget constrained system it meaningfully shifts detail to where it matters.
Starspeed, a multiplayer spaceship game by James Kane, streams environments built from over 100 million Gaussian splats through the browser using .RAD. Fujiwara Ryu of Hololive has demonstrated 40 million splat captured spaces running smoothly on smartphones and Quest headsets.
Spark remains open source and MIT-licensed. The build-lod CLI tool converts any 3DGS file into a streamable .RAD with a precomputed LoD tree, or you can generate the tree on-demand in the browser. The full blog post, with interactive 3D examples throughout, can be viewed here.






