Improve GSplat LOD system with geometric progression, FOV compensation, and budget balancing fixes#8506
Merged
mvaligursky merged 5 commits intomainfrom Mar 6, 2026
Merged
Conversation
…n, and budget balancing fixes Replace linear lodDistances array with lodBaseDistance + lodMultiplier geometric progression. Add O(1) logarithmic LOD computation, FOV compensation, and fix budget balancer monotonicity violations. Made-with: Cursor
Member
|
exciting! |
Contributor
There was a problem hiding this comment.
Pull request overview
This PR modernizes the unified GSplat octree LOD system by moving from manually specified linear threshold arrays to a geometric progression model, adding FOV-aware LOD compensation, and improving budget enforcement behavior and convergence.
Changes:
- Replace
lodDistanceswithlodBaseDistance+lodMultiplier, and compute LOD index in O(1) via logarithms (with FOV compensation). - Improve global budget enforcement with monotonicity safeguards and a dynamic
_budgetScaleto reduce balancer passes. - Update scripts/examples UI to use the new LOD API and add continuous budget/FOV controls.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| src/scene/gsplat-unified/gsplat-placement.js | Replaces stored LOD distance array with geometric parameters and adds a dirty flag for LOD re-evaluation. |
| src/scene/gsplat-unified/gsplat-octree-instance.js | Implements FOV-compensated, logarithmic LOD selection and wires component-driven LOD invalidation. |
| src/scene/gsplat-unified/gsplat-manager.js | Tracks camera FOV for LOD invalidation and adds dynamic _budgetScale to improve budget convergence. |
| src/scene/gsplat-unified/gsplat-budget-balancer.js | Adjusts budget balancing loops to stop upgrades earlier to avoid near/far quality inversions. |
| src/framework/components/gsplat/system.js | Updates component property wiring to the new lodBaseDistance / lodMultiplier API. |
| src/framework/components/gsplat/component.js | Adds new LOD properties, deprecates lodDistances, and forwards LOD changes to placements. |
| scripts/esm/gsplat/streamed-gsplat.mjs | Updates script attributes and component initialization to use lodBaseDistance. |
| examples/src/examples/gaussian-splatting/world.example.mjs | Updates example to new LOD API and switches budget control to a continuous slider model. |
| examples/src/examples/gaussian-splatting/world.controls.mjs | Adds camera orbit toggle and LOD/budget sliders. |
| examples/src/examples/gaussian-splatting/viewer.example.mjs | Tweaks default lodBehindPenalty for the viewer example. |
| examples/src/examples/gaussian-splatting/lod-streaming.example.mjs | Updates presets and UI wiring for geometric LOD parameters and budget slider. |
| examples/src/examples/gaussian-splatting/lod-streaming.controls.mjs | Adds camera FOV + LOD sliders and switches budget to continuous slider control. |
| examples/src/examples/gaussian-splatting/lod-streaming-sh.example.mjs | Updates presets and adds budget + geometric LOD controls. |
| examples/src/examples/gaussian-splatting/lod-streaming-sh.controls.mjs | Adds geometric LOD + budget sliders. |
| examples/src/examples/gaussian-splatting/lod-instances.example.mjs | Switches to budget slider and updates instances to new LOD API. |
| examples/src/examples/gaussian-splatting/lod-instances.controls.mjs | Renames “Colorize” to “Hue Animation” and adds budget slider. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
examples/src/examples/gaussian-splatting/lod-streaming.controls.mjs
Outdated
Show resolved
Hide resolved
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
examples/src/examples/gaussian-splatting/lod-streaming.example.mjs
Outdated
Show resolved
Hide resolved
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overhauls the GSplat LOD distance system and budget balancing for better visual quality and stability.
Changes:
lodDistancesarray API with geometric progression vialodBaseDistanceandlodMultiplier— each LOD level transitions atlodBaseDistance * lodMultiplier^ilodBaseDistanceorlodMultiplierchange on the component_budgetScalethat uniformly shifts all LOD boundaries to bring initial estimates closer to the budget target, reducing balancer passesAPI Changes:
GSplatComponent.lodBaseDistance(new) — base distance for first LOD transition. Defaults to 5.GSplatComponent.lodMultiplier(new) — geometric ratio between successive LOD thresholds. Defaults to 3.GSplatComponent.lodDistances(removed) — callsDebug.removed()with migration instructionsExamples:
lodBaseDistance/lodMultiplierAPIlod-streaming-shandlod-instancesexampleslod-streaming: reorganized UI with Camera panel (FOV, High Res)world: added Camera panel with Orbit togglelod-instances: renamed "Colorize" to "Hue Animation"Performance:
Made with Cursor