Chunk LOD
Chunk LOD reference.
Background
Rendering large-scale 3DGS scenes requires far more system resources than most current devices provide. Large 3DGS scenes are therefore difficult to render directly on common hardware. A stream + LOD approach reduces resource requirements by sacrificing detail in less important regions and preserving quality near the visual focus. @manycore/aholo-viewer uses a chunked LOD implementation, chunk-lod, as its primary LOD solution. LOD data is generated through a post-processing Gaussian fusion pipeline that does not require retraining.

Generating chunk-lod
chunk-lod data used by @manycore/aholo-viewer is usually generated with @manycore/aholo-splat-transform. The generation process mainly includes these steps:
- Chunk splitting
Chunks are split primarily with an octree. The default maximum chunk size is
400000Gaussians. For large scenes, increase it to800000or higher to control the finalchunkcount. - Gaussian search and fusion
Inside each chunk, each
lodlevel is generated from the previous level. Every level repeatedly searches and merges Gaussians until it reaches the target count.For levels that retain fewer Gaussians, the remaining Gaussians are enlarged to reduce holes caused by low retained counts.
After fusion, an additional
opacityculling pass removes Gaussians with poor visibility.When the Gaussian count is below a threshold, fusion stops. This can make the output count slightly higher than the target, but the deviation is small and reducing the final number of chunks is usually worth it.
To avoid non-terminating processing, each level has a maximum iteration count. If that limit is reached, processing exits even if the target count has not been met.
- Output processing
Low-level data is packed together during output. Low-level data is usually about
1%of the original data, so the amount is small and packing also removes unnecessary chunks. The final output includeslod-meta.json, which describes thechunk-loddata.
References:
lod-meta.json Format
interface IBox {
min: [number, number, number];
max: [number, number, number];
}
// typings for
interface LodMeta {
magicCode: 2500660;
type: 'lod-splat';
version: string;
counts: number;
shDegree: number;
levels: number;
files: string[];
forwardBox: IBox;
permanentFiles: number[];
tree: Array<{
bound: IBox;
lods: Array<{
file: number;
offset: number;
count: number;
}>;
}>;
}
counts: total Gaussian count atlevel 0.shDegree: spherical harmonics degree.forwardBox: bounding box of the space containing roughly80%of all Gaussian spheres atlevel 0.files: file list.permanentFiles: file indices that must stay resident in memory or GPU memory.tree: chunk tree forlod.tree[i].bound: chunk bounding box. This box is also computed from an approximate distribution and excludes outliers.tree[i].lods: LOD data for the chunk.tree[i].lods[j].file: data file index.tree[i].lods[j].start: starting Gaussian offset.tree[i].lods[j].count: Gaussian count.
Lod Scheduler
@manycore/aholo-viewer provides a complete chunk-lod scheduler. See LodSplat for the API reference and Streaming LOD for an example.