Skip to content

Version 4 - 100M splat scale support via LOD's

Latest

Choose a tag to compare

@MichaelMoroz MichaelMoroz released this 20 Jul 04:43

v4

⚠️ v4 is not compatible with v3. All splats must be re-imported, and the new example scenes must be used. The runtime rendering path, prefab format, materials, and importer output have all changed.

v4 is effectively a rewrite of the rendering core and tooling.

Combined runtime rendering (new architecture)

  • All active splat objects are now transformed into world space and sorted together as a single combined render, instead of each splat being its own self-sorting object.
  • Any dynamic number of splats in one world: move, rotate, scale, and toggle them at runtime.
  • Instancing — render as many copies of an object as you want without extra memory.
  • Splats correctly intersect with scene geometry.
  • Depth-sorted every frame for both the main player view and the VRChat photo camera (fixes a photo-camera crash).

LOD system (new) — huge scenes

  • Import-time LOD hierarchy generation; the runtime selects per-chunk detail against a scene-wide, per-platform splat budget.
  • Render up to ~100M splats in a world (limited mainly by VRChat world size), with a user-selected quality (max splats rendered at once).
  • Streaming import for large PLY files (no longer capped at 16M).

View-dependent color / Spherical Harmonics (new)

  • Spherical harmonics up to SH3 for view-dependent color.
  • Optional SH texture compression (RGB565 / BC1 / BC7) and BC7 color compression to cut memory.

VRC Light Volumes integration (new)

  • Splats can pick up your world's baked lighting (bright emissive parts preserved), with a runtime toggle and intensity control.

Importer (rewritten)

  • Now imports .spz (Niantic format) in addition to .ply — scans from Postshot, Scaniverse, and other standard 3DGS tools.
  • Interactive import preview: crop box, horizon/wall alignment by picking points, and size normalization to a target extent.
  • Two import modes:
    • LOD — a combined splat object with a level-of-detail hierarchy, rendered through the sorted runtime path (recommended).
    • Standalone — the previous self-rendering mesh with precomputed direction-based sorting; still works on avatars or outside VRChat.
  • Re-import tools — re-import a splat exactly, or reopen it in the wizard with its stored import settings.

Auto-generated in-world UI (new)

  • Drop a splat prefab into the scene and the scene renderer + world-space control UI build themselves.
  • Gallery mode: list splats, show one at a time, selection synced across the instance, optional master lock, per-splat names and descriptions.
  • Quality presets (Very Low / Low / Medium / High), SH band, Light Volumes toggle + intensity, Gaussian scale, alpha cutoff / cull, antialiasing, LOD splat cap, and an Advanced panel.
  • Bilingual — every control in English and Japanese.
  • Only the gallery selection is networked; all other controls are per-user local.

Terrain colliders (new)

  • Rasterize a splat into a GPU heightmap and generate a Unity TerrainCollider so visitors can walk on your scan (2.5D top-down: good for ground and terrain; overhangs and interiors are not represented).

Android / Quest support (new)

  • A pre-build pass converts renderers to no-geometry shaders (zero-sized quad meshes) and swaps in a fake-sRGB path, so splats run on standalone Quest and Android (VRChat mobile). Converted automatically at build time. iOS is currently untested.

Editor tooling

  • Automatic, editor-only depth sorting of every splat object in the Scene view (owns its own transient resources; does not reuse the runtime ones).
  • Grouped/cleaner renderer inspector, scene-local editor state, and render targets moved to per-world temp assets.

Rendering quality & projection

  • Exact analytic ellipse projection — each Gaussian's quadric is projected into clip space and its screen-space ellipse solved analytically (no affine Jacobian approximation): sharper splats up close at VR fields of view, fewer jitter / popping / missing-splat artifacts, and less overdraw.

Removed / changed

  • Removed the stochastic transparency path.
  • Removed manual sorting controls from the in-game UI (handled automatically now).
  • Prefab format, materials, and sorting textures changed — hence the re-import requirement.

Performance

  • General performance improvements across the sort and render path.