GITAAA

SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans

SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans

Asset description

Bring real places into Unity with 3D Gaussian Splatting: explorable scans reconstructed from photos. Drop in a .sog, .spz or 3DGS .ply, add collision and gameplay, or take it to VR. Built-in, URP and HDRP are supported. Large captures stream under a fixed GPU budget — city-scale scans included. Full manual, troubleshooting table and tuning guide ship inside the package, in English and Japanese. Demo video in the gallery above. All gallery images are unedited in-Unity captures. Support: publisher contact on this page. Import: one step, three formats SOG (PlayCanvas / SuperSplat), SPZ (Niantic, v3 gzip and v4 NGSP+zstd) and 3DGS PLY (SH degree 0–3). Drop a bundled .sog, .spz or .ply into your project for a render-ready GaussianSplatAsset — no external converter, no command line. An unbundled SOG (meta.json plus its WebP files) imports through an editor menu instead, in the same one step. superspl.at datasets import as they are. A binary 3DGS PLY can also be converted directly to a streaming bake from the editor. Rendering: every pipeline, correct compositing • Every render pipeline. Built-in, URP (Unity 6 Render Graph, with Compatibility Mode fallback) and HDRP (Custom Pass). Shaders ship inside the package and are included in player builds automatically — no "Always Included Shaders" setup. • GPU depth sorting. A radix sort in compute re-sorts the draw order as the camera moves, never on the main thread, with an automatic background CPU fallback where compute sorting is unavailable (specifics under Technical details). • Render scale. Draw splats into a downscaled offscreen target and composite: fill cost drops roughly with scale², UI and geometry stay full resolution. XR has a stereo-array version of the same lever. • Correct compositing. Splats depth-test against your scene, so scanned content sits behind walls and props instead of floating over them. • View-dependent color. The capture's SH bands 1–3 are evaluated per view, so gloss, glass and wet surfaces shift with the camera as recorded; switchable per object. Training is the default color mode for Linear projects; Legacy remains available. Far-field billboards retain SH color. Streaming: city-scale under a fixed budget Large captures do not fit in GPU memory, so SplatBridge streams them under a hard resident-splat budget you set once. If all finest full slices fit after page rounding and transition reserve, full detail stays resident automatically. Otherwise screen-space LOD adapts within the same cap. • Screen-space quality. Splat Quality Pixels (τ) sets detail in screen pixels, with a fixed 2 px default. An optional Auto preset chooses a platform-specific value. • Coarser, never holes. The plan pays for every cell of the dataset before spending anything on detail, so an under-sized budget is absorbed by drawing the scene coarser, not by dropping parts of it. • Know before you ship. The bake log and the inspector report a coverage gate verdict up front: a budget too small even for the cheapest complete view is caught in the editor, not discovered on device. An optional debug log prints coverage, achieved quality, the error distribution and the frame-time knee, so tuning is measurement rather than guesswork. • Fixed memory. Max Resident Splats is a hard memory cap and the main performance lever — τ sets quality. The GPU buffer is allocated once at that size, with per-frame upload budgets, frustum culling and no-flash chunk swaps. • Pre-baked, so the runtime never decodes. A one-click bake (.splatbake) turns a streamed-SOG dataset into GPU-ready records, so a runtime chunk load is a seek and a read with no image decoding in the loop. • Live in the editor. The Scene view runs the real streaming loop before Play — same worker, same budget, same LOD cuts — and idles once converged; move the camera to resume. Edit scans in Unity Select regions in Scene View, preview the result, then split, delete or extract. Use five volume shapes, lasso or selection brush with both SplatObjects and baked Streamers. Add, subtract and intersect selections, filter by opacity, size or color, and adjust selected color/opacity. Review isolated-cluster candidates before deletion. Merge objects and rebuild LODs, or export SOG, streamed SOG ZIP or PLY. Mirror Copy creates reflected parts; separated parts are ordinary GameObjects for Unity animation. Convert a binary 3DGS PLY directly into a streaming bake with generated LODs. Clone Repair and runtime clipping are supported editing tools. • Realtime shadows (URP/HDRP). Cast onto Unity Lit meshes and receive their shadows, with independent Cast Shadows / Receive Shadows switches, both off by default. This adds shadows; it does not remove lighting captured in the scan. Make it a game • Collision. Generate a MeshCollider with adjustable grid size and occupancy. Voxel is the default; smoothing and surface fitting are optional. Use it with Unity physics and NavMesh baking. Generation reads the dataset independently of the displayed LOD and needs Editor memory. This is not runtime streamed collision. • Reveal / hide animation. Five patterns (Scatter, FromPoint, Rain, Dissolve, Sweep) animate the actual gaussians in the vertex shader — no particle-to-splat handoff pop, and the fully revealed frame is exactly the normal render. It can wait for the streamer's first full coverage, so the scene converges at once instead of popping in. • VFX Graph bridge. Sample the live splat buffers from VFX Graph: particles that spawn on the scanned surface, inherit its color and sync to the reveal wave. Two ready-to-paste HLSL recipes are in the manual. • Runtime loading. SplatRuntimeLoader.LoadFromFile(path) loads .sog / .spz / .ply at runtime; errors surface as typed exceptions with the cause (unrecognized container, unsupported version, corrupt data …), not silent failure. VR — and experimental Meta Quest standalone PC VR (URP) is a first-class target: Single Pass Instanced and Multiview stereo, verified on Quest 3 over Link (OpenXR). The sort follows the head pose, so depth ordering holds up as you look around. SplatBridge also runs on Quest 3 standalone (Android, OpenXR, Vulkan, Multiview) — the same importer, streamer, GPU depth sort and stereo path as on desktop, with one-time StreamingAssets extraction handled for you. It works on device today. Standalone is labelled experimental on purpose. Performance on standalone hardware depends heavily on the size of your capture and on your settings, and tuning work is ongoing. Treat it as something to prototype and measure with, not as a platform where a given frame rate is guaranteed. One more lever where fill binds: an opt-in impostor bakes the far field into a billboard, so the live draw only pays for near splats. The included Quest scene ships it on and tuned. Use the included tuning panel and the manual's Quest setup guide to adjust budget, render scale and splat size on your device. Standalone performance remains scene-dependent. Included samples: 3 ready-made scenes The smaller demo download includes source SOG. First open ClassroomDemo in the Editor and wait for streaming data to be generated; later openings reuse the verified cache. Then press Play. • Demo scene. An indoor classroom (1.0M splats, 175 MB), ready to play: streaming, view-dependent color, a Sweep reveal, a camera dolly and physics balls on a splat-generated collider. • Tuning panel. A ready-made VR scene with streaming/frame-time telemetry and controller adjustments for budget, τ, render scale and quad extent. • Quest scene. XR rig, floor and streamer preconfigured for standalone. Its README lists the required Android/OpenXR project settings. Both XR scenes stream the classroom set. Every bundled dataset is our own content — nothing to credit. Requirements • Unity 6000.x (tested on 6000.3.25f1 and 6000.6.1f1). • Built-in, URP 17.x or HDRP 17.x. • Windows / macOS desktop and Android (including experimental Meta Quest 3 standalone — see above). WebGL is not supported (streaming needs file IO and compute). • VR/XR: URP + OpenXR; HDRP + OpenXR is supported. Built-in XR is unsupported. Known limitations • Splats retain captured lighting; scene lights and GI do not relight them. Shadow receiving adds darkening, not illumination. HDRP exposure/tone mapping affect both color modes; bright HDR backgrounds may need intensity adjustment. • Meta Quest 3 standalone support is experimental (see above): budget time to tune with the included panel and plan around that. • SSOG/bake HTTP streaming requires ranges, strong ETags and identity encoding. Ordinary SOG/SPZ/PLY supports whole-file fallback, needs temporary disk space, and retains fully decoded CPU data until stop. Live SSOG decodes WebP; bake avoids that cost. • Region edits preserve existing LODs; use Merge or Rebuild LODs to regenerate them. Large exports need temporary disk space and memory for metadata and caches. Lasso/brush supports front-surface, through-depth and manual-depth selection. Surface capture can take longer on large scans. • Runtime clipping changes rendering; it does not rebuild colliders. • New shadow paths are validated on desktop Metal; XR and other graphics APIs still need validation. Built-in shadow integration is not supported. Roadmap (no dates promised, order may change) • We are considering further enhancements to the editing tools. • Standalone Quest performance — continued optimization of the mobile GPU path, aiming to drop the experimental label • iOS (iPhone / iPad) All 1.x updates are free for purchasers. Supported formats • SOG (PlayCanvas / SuperSplat): bundled .sog and unbundled meta.json, format version 2. Streamed SOG (lod-meta.json) imports through the bake step. • SPZ (Niantic): v3 (gzip) and v4 (NGSP + zstd). v1/v2 are rejected with a clear error. • 3DGS PLY: SH degree 0–3, binary little-endian. • .splatbake: pre-baked GPU records and leaf table, generated by the importer or editor menu. • Axis conventions: a Source Convention setting (Standard 3DGS — the PLY / SOG / SPZ default — plus Y-up right-handed, Z-up right-handed and Unity Native) brings files written in other frames in the right way up; collision meshes follow it. Rendering • SH bands 1–3 for imported assets and baked streams. In 1.0.4, Training color mode is the project-wide default: use Linear color space for training-space compositing and corrected splat projection. Legacy is available for the previous rendering. Source-image uses extra buffers and compositing to favor the source-image appearance. Legacy skips that additional compositing and may reduce GPU cost, but colors, brightness and transparency can differ. Performance gains depend on the scene, platform and render settings. Linear is the validated configuration for this update. • Far-field billboard baking preserves SH color and invalidates cached views when SH data, bands or color mode change. HDRP retains its live far-field path. • Unity 6000.x (tested on 6000.3.25f1 and 6000.6.1f1). • Built-in RP, URP 17.x (Unity 6 Render Graph, plus Compatibility Mode fallback), HDRP 17.x (Custom Pass). Shaders live inside the package and ship in player builds automatically. • Depth sorting: GPU radix sort on D3D12 / Vulkan / Metal; automatic threaded CPU counting-sort fallback elsewhere. Sorting never blocks the main thread. The camera pose is checked every frame; a re-sort triggers past a small position/rotation threshold. • Splat render scale (offscreen + composite) for desktop and a separate stereo-array version for XR, with opt-in occlusion by opaque scene depth. VR / XR • URP + OpenXR; HDRP + OpenXR. Built-in XR is not supported. • Single Pass Instanced and Multiview stereo. PC VR verified on Quest 3 over Link (D3D12) and desktop OpenXR runtimes. Use an XR Origin rig and the OpenXR plugin. • Meta Quest 3 standalone: experimental. IL2CPP / ARM64 / Vulkan / Multiview; StreamingAssets sources are extracted to device storage automatically on first run. An in-headset tuning panel sample is included. • Optional far-field impostor (off by default): the resident far leaves are baked into a view-facing billboard array every few frames and composited, so the live draw covers only the near region. The near/far radius is derived from a screen-space parallax error budget β (in pixels), the focal length and a head-movement budget — there is no distance threshold to set. Per-eye stereo bake by default; an optional mono bake writes one view plus a per-pixel depth channel and reprojects each eye through it, at half the bake cost. Requires the GPU sort path. Streaming • Automatically selects all finest full slices when their page-rounded cost fits the effective budget after transition reserve. Otherwise adaptive screen-space LOD applies; the memory cap is unchanged. • Hard resident-splat budget (single pre-allocated GPU buffer); screen-space quality metric (τ, scale-invariant) with coverage-first level selection — under-budget renders coarser rather than dropping cells. • Bake/Inspector coverage checks report Ok, RefinementMarginUnsatisfied (little refinement headroom), or CoverageInfeasible (raise the budget or re-bake). • Per-frame upload budgets, frustum culling with hysteresis, no-flash chunk swaps, GC-friendly steady state. • Local files and opt-in HTTP/HTTPS: loose/ZIP/SSOG and .splatbake stream selected ranges; ordinary SOG/meta.json/SPZ/PLY decode fully. Partial reads require 206, strong ETags and identity encoding. Ordinary formats can fall back to a complete temporary download without ranges/strong ETags (disk space required; no persistent reuse). Bounded, replaceable persistent/session caches use OS cache paths and validate online on reopen. Loose datasets need immutable versioned directories and relative child URLs; metadata queries are not inherited. • Convert binary 3DGS PLY directly to a LOD-enabled .splatbake with block-based reading and temporary-file sorting. No external conversion tool is required. Imported SOG/SPZ/PLY scene objects can also be converted through LOD rebuilding (asset snapshots remain limited to eight million splats). Existing streamed SOG and lod-meta.json sets retain their separate bake workflow. • Editor Preview (Inspector toggle on GaussianSplatStreamer, Basic section, default ON): drives the same streaming worker, Max Resident Splats budget and LOD cuts from the Scene view camera outside Play mode. Pumps until converged, then idles (no player-loop pumping or repaints), and resumes on camera or object movement. Does not mark the scene dirty. Also visible in the Game view while editing, using the Scene view camera pose as an approximation for LOD/sort. The far-field impostor stays disabled during editor preview (Play mode or device only). If editing feels heavy with a large dataset, turn the toggle off — the streamer is then inert outside Play mode. Gameplay integration • MeshCollider generation from splats (editor context menu or runtime API): standard static collision, works with CharacterController, Rigidbody, raycasts and NavMesh baking. • Reveal/hide animation (5 patterns) running on the actual gaussians in the vertex shader; VFX Graph bridge sampling the live splat buffers; runtime loading API with typed exceptions. Editor editing and shadows • Shared Scene View selection for SplatObjects and baked Streamers: five shapes, lasso/brush, ordered Add/Subtract/Intersect and opacity/size/color filters. Split/delete/extract, multi-axis Mirror Copy, selected color/opacity adjustment and isolated-cluster review. Lasso/brush supports front-surface selection, selection through all depths and a manual depth range. Lasso can select centers or touching projected ellipses; brush selects centers. Surface selection uses a captured view of the chosen target and can take longer on large scans. • Merge combines complete finest data, transforms and SH, then rebuilds spatial partitions and LODs into a new Streamer. Single-object LOD rebuilding is also available. Local bake inputs use temporary disk files; Renderer merge snapshots retain an eight-million combined limit. Merge requires uniform object scales and compatible rendering settings. Colliders/animation are not merged. • SOG v2, streamed SOG ZIP (optional rebuilt LODs) and binary PLY export require no external tools. Local bake exports read bounded blocks; metadata, caches and temporary files still need memory/disk. Renderer exports copy their asset. SOG is quantized; exports retain source-local attributes, not scene lighting or runtime clipping. • Clone Repair (donor picker and planar brush with rotation/scale/color controls) and runtime clipping are available. Runtime Clip has an independent shape-only selection, target Fit, up to eight animated child regions, ordered operations or OR/AND, and optional pixel clipping. It does not rebuild colliders. • URP/HDRP realtime shadows: independent Cast Shadows / Receive Shadows, default off. Directional/Point/Spot; HDRP also Rectangle. Casting uses resident splats; receiving defaults to Shared Surface with an automatically generated mesh, with Direct also available. Shared surfaces approximate the geometry. Receiving bypasses the far-field color cache. Cost depends on scene and shadow settings. No baked GI/Shadowmask, ray-traced shadows or Built-in shadow integration. Captured illumination remains. Desktop Metal validated; Shared Surface targets desktop mono. Shadow paths are not yet validated on XR or other graphics APIs. Dependencies and code • Pure C# decoders (including the WebP VP8L decoder) — no native plugins, no P/Invoke; the only bundled managed DLLs are ZstdSharp and System.Runtime.CompilerServices.Unsafe. Third-party notices included (MIT). • Source code included — everything installs into a single folder, Assets/SplatBridge. Assembly definitions keep Runtime and Editor separated. • All bundled demo data is original content created by the publisher: one synthetic scene (rendered from the CC0 "Classroom" Blender demo file — public domain, no attribution required — and reconstructed with our own Gaussian Splatting pipeline) and one photographic capture made by us. Nothing in the package carries an attribution requirement. An attribution overlay helper component is included and prewired in the demo scene, for your own captures that do need a credit line. Not supported • WebGL (streaming needs file IO and compute shaders). • AI repair and curved-surface clone painting. • View-dependent color (SH bands 1–3) costs 18 / 48 / 90 bytes per resident splat (fp16) in a separate buffer; it is per-object switchable and the Quest sample ships it off. SH Bands 0 disables view dependence; select 1–3 to enable it. Band changes apply on reload. Disabling before loading avoids the SH GPU buffer; toggling off after loading retains that buffer. Live streamed SOG sources stream the base color only. Demo distribution: source SOG is included under Editor. First scene opening converts it to a validated StreamingAssets bake, reused on later openings. Existing mismatched files are not overwritten. Only the bake is used in Players. Documentation: full manual, troubleshooting table and tuning guide in the package (English and Japanese).

SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 2SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 3SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 4SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 5SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 6SplatBridge — 3D Gaussian Splatting: Import, Stream & Play Real-World Scans 7