Skip to content

feat(splats): Add RAD renderer with Coit Tower parity diagnostics#3431

Draft
charlieforward9 wants to merge 8 commits into
masterfrom
codex/splat-rad-renderer
Draft

feat(splats): Add RAD renderer with Coit Tower parity diagnostics#3431
charlieforward9 wants to merge 8 commits into
masterfrom
codex/splat-rad-renderer

Conversation

@charlieforward9

@charlieforward9 charlieforward9 commented May 16, 2026

Copy link
Copy Markdown
Collaborator

Goals

Move the RAD splat renderer/demo toward Spark 2.x Coit Tower parity while keeping this PR reviewable as the renderer-side follow-up to the SPZ/RAD loader work.

Use Spark as the reference experience for Coit Tower: same dataset, Spark-like FoV/LoD/foveation budgets, and an explicit side-by-side capture so the remaining visual/performance gap is easy to discuss. @ibgreen feedback requested on the renderer architecture and remaining parity gap.

Actual changes

  • Adds the RAD splat renderer integration, render-page compaction, LoD traversal, and deck-layers test coverage.
  • Adds worker-backed RAD chunk decoding so page loads do not block the UI thread as heavily.
  • Adds active-row WebGPU projection/sort paths for paged LoD frontiers instead of rebuilding/sorting full resident pages every frame.
  • Tunes the Gaussian splats Coit defaults toward Spark: FoV 75, LoD 1.5 budget, Spark-style foveation controls, sqrt(8) Gaussian support, larger residency budget, lower request pressure while moving, and settled/interacting request cadence.
  • Adds tile-sort overflow telemetry and frontier diagnostics for selected parent rows, leaf rows, max child count, expanded opacity, decoded scale, page count, draw count, requests, evictions, and upload time.
  • Preserves RAD color range decoding and premultiplied alpha blending in the render path.
  • Adds the current Spark-vs-loaders Coit capture as a PR review asset.

Current Coit comparison

Spark 2.x reference vs loaders.gl RAD renderer

Current loaders.gl capture metrics from the screenshot run:

  • 3,749,995 / 50,937,127 splats
  • 60,609 ms
  • 264 chunks | 58 pages | 3,749,995 draw | 0 req | 18 evict | 0 ovf | 591 ms

This is intentionally not called complete parity yet. The tower is more resolved and the tile overflow path is controlled at this page size, but the background/city still does not match Spark and the coarse LoD appearance is still visibly wrong. The next useful review target is whether the remaining gap is mostly LoD frontier selection, parent splat covariance/projection, color/alpha evaluation, or sort/blend behavior.

Reproduction Steps

  1. Install dependencies from the repo root:
yarn
  1. Start the Gaussian splats example:
yarn --cwd examples/website/gaussian-splats start --host 127.0.0.1 --port 5177
  1. Open http://127.0.0.1:5177 in Chrome with WebGPU enabled.

  2. Load the Coit Tower RAD URL:

https://storage.googleapis.com/forge-dev-public/asundqui/rad/260217/coit-40m-sh1-lod.rad
  1. Use the Spark-like demo settings:
FoV: 75
LoD: 1.5
Scale: 1.00
Behind: 0.20
Cone: 0.40
  1. Let the camera settle for about 60 seconds, then compare the overlay metrics and visual result against the Spark 2.x reference capture above.

Validation

  • yarn lint fix was attempted on this Windows checkout, but the existing wrapper exits 1 with no diagnostics through the git hook/lint path.
  • Direct Biome format/lint over the touched RAD/splat files completed cleanly.
  • yarn test-headless modules/deck-layers/test/splat-layer.spec.ts
  • yarn test-headless modules/splats/test/rad-source-loader.spec.ts
  • yarn --cwd examples/website/gaussian-splats build

The Gaussian splats build passes with existing Vite warnings about browser externalization for worker_threads/Node stream shims and large chunks.

@charlieforward9 charlieforward9 requested a review from ibgreen May 16, 2026 16:11
Base automatically changed from codex/splat-spz-rad-loaders to master May 19, 2026 14:16
@ibgreen ibgreen changed the title [codex] Add RAD splat renderer demo feat(splats) Add RAD splat renderer demo May 19, 2026
@charlieforward9 charlieforward9 force-pushed the codex/splat-rad-renderer branch from 2c51f9e to 4b00375 Compare May 23, 2026 14:52
@charlieforward9 charlieforward9 removed the request for review from ibgreen May 23, 2026 17:03
@charlieforward9 charlieforward9 changed the title feat(splats) Add RAD splat renderer demo feat(splats): Add RAD renderer with Coit Tower parity diagnostics May 25, 2026
@charlieforward9

Copy link
Copy Markdown
Collaborator Author

@ibgreen could use your eyes on the current Coit Tower RAD renderer state. I refreshed the PR title/body with the latest Spark-vs-loaders screenshot, exact repro steps, and validation notes.

The useful signal from the latest run: tile overflow is now controlled at the current 64k render-page size (0 ovf), request pressure is settled (0 req after ~60s), and the renderer draws ~3.75M splats across 58 pages, but the visual still misses Spark badly in the background/city and coarse LoD appearance. The next review question is whether that remaining gap is mostly frontier selection, parent splat covariance/projection, alpha/color evaluation, or sort/blend behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant