Splat.Report

The SOG format

Working4 min readUpdated 2026-07-09Verified 2026-07-09

SOG stores Gaussian attributes as sorted 2D image grids so that image codecs do the compression work. Sorting places similar Gaussians next to each other, which is why the grids compress so well, and it’s the format this pipeline actually delivers through: PlayCanvas’s engine, editor and SuperSplat all read it natively, which none of the other compressed formats in this part can claim.

Where the technique comes from

SOG’s sorting step is Self-Organizing Gaussians research from Wieland Morgenstern and colleagues, using Parallel Linear Assignment Sorting (PLAS) to arrange millions of Gaussians into a 2D grid so that neighbouring cells hold similar attribute values. That spatial coherence is what makes an ordinary image codec effective: WebP compresses smooth, locally-similar image data far better than noise, and a well-sorted grid of positions or colours looks a lot more like the former than the latter. PlayCanvas built on this research first as “SOGS” inside its own tooling, then in September 2025 open-sourced SOG as a defined, versioned container spec in its own right, with SplatTransform as the reference writer and the PlayCanvas Engine (2.11.0 and later) as the reference reader.

Container layout

A SOG asset is a small set of files, either loose or bundled into a single .sog zip: a meta.json describing the scene and naming every other file, plus a handful of lossless WebP images. means_l.webp and means_u.webp split each Gaussian’s position into lower and upper 8-bit halves; scales.webp and quats.webp hold per-axis scale quantisationStoring a value at lower numeric precision than it was computed at, for example rounding a float32 position to 16 bits or mapping a scale to one of a fixed set of codebook entries, to shrink storage size at the cost of some accuracy. and a compact “smallest-three” quaternion encoding; sh0.webp carries the degree-0 spherical-harmonics colour and opacity; and optional shN_centroids.webp / shN_labels.webp pairs carry higher SH bandsThe successive groups of spherical-harmonics coefficients, band 0, band 1, band 2 and so on, each adding 2l+1 coefficients per colour channel; band 0 gives flat diffuse colour and higher bands add increasingly directional, specular-like variation at increasing storage cost. as codebook centroids plus per-Gaussian palette indices, rather than storing every coefficient directly. The spec is explicit that these images must be lossless WebP: a lossy re-encode would corrupt already-quantised values a second time and introduce visible structural artefacts rather than the smooth degradation a photo would show. The current developer documentation describes version 2 of the format, and readers are expected to check a version field in meta.json and ignore fields they don’t recognise, which is how the v2 revision was able to land without breaking older readers.

What it costs, and what it buys

PlayCanvas’s own figures put SOG at roughly 20x smaller than the equivalent raw PLY, and at something like 2-3x smaller again than PlayCanvas’s earlier chunked “compressed PLY” scheme, which itself only quantised and bit-packed values without the sorting step. PlayCanvas’s May 2025 SOGS-adoption post cites a roughly 1GB church scene compressing to 55MB, the 20x figure above; its September 2025 SOG open-source announcement cites a different, 4-million-Gaussian scene (also from a roughly 1GB PLY) compressing to 42MB, covered on the PlayCanvas and SuperSplat page. Both are real, specific examples from two different capture scenes rather than a single canonical figure, so expect actual results to fall somewhere in that range depending on scene content. That compression is lossy by design: dropping to 8-bit codebook indices and 16-bit position halves discards precision a full-float PLY keeps, and pushing higher SH bands through a shared centroid palette rather than storing them per-Gaussian is a coarser approximation than 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.‘s per-attribute quantisation of every coefficient. In exchange, a scene that would take minutes to download as PLY loads in seconds as SOG, which is the only number that matters once a splat is behind a phone on a mobile connection rather than a workstation on a LAN.

In practice

For this pipeline, the practical sequence is train in PostShot to PLY, then convert with SplatTransform to SOG before anything goes near PlayCanvas, whether that’s the Engine directly, PlayCanvas React, or a scene published through SuperSplat and its editor’s native drag-and-drop .sog support. There’s rarely a reason to hand a browser a raw PLY: the size difference alone means a SOG conversion should be the default last step of every export, not an optional optimisation reached for only when a scene turns out too large. The one case worth pausing on is a scene with genuinely important high-frequency specular detail, glass, chrome, wet surfaces, where the shared SH palette in higher bands can soften highlights that per-coefficient quantisation in SPZ would keep sharper; for anything else, SOG’s size and native PlayCanvas support make it the format to reach for by default.

Related papers

Compact 3D Scene Representation via Self-Organizing Gaussian Grids

Morgenstern, Barthel, Hilsmann, Eisert · 2024

Basis of the SOG format: sorts Gaussians into a 2D grid so attributes compress as images.