PPajama Studio
Starting WebGPU…

Rust · wgpu · WGSL · measured in-browser

Spacetime
Gaussian Lab

A small renderer experiment for asking one concrete question: what should a cross-platform viewer do with a time-varying Gaussian scene before reconstruction, compression, and production constraints are known?

v0.1

Scope: procedural spacetime splats, not a learned reconstruction and not Peripheral’s implementation.

LIVE RENDER
GPU adapter pending
RepresentationProcedural ST splats CompositionBack-to-front alpha
FPS
Visible
CPU prepare
CPU sort
Upload/frame
drag to orbit · wheel to zoom
00:00.000 00:08.000

What this is—and is not

“4D” needs a representation, not a marketing label.

Every Gaussian here has spatial attributes and a time-dependent motion rule. Rust evaluates the scene at time t, culls and sorts visible splats, then wgpu submits instanced quads to a WGSL shader.

This proves the viewer and profiling path. It does not learn geometry or motion from video. A full 4DGS system additionally needs calibrated multi-view inputs, training or feed-forward reconstruction, a defined temporal representation, validation, and an asset pipeline.

Frame pipeline

One frame, six explicit decisions.

  1. 01
    Evaluate time

    Sample each splat’s position and opacity at the requested timestamp.

  2. 02
    Build camera

    Use the same view/projection contract for culling, sorting, and rendering.

  3. 03
    Frustum reject

    Avoid sorting and uploading splats that cannot contribute to this frame.

  4. 04
    Depth sort

    Back-to-front order makes standard alpha composition predictable.

  5. 05
    Upload compact frame

    Only visible GPU records cross the CPU→GPU boundary.

  6. 06
    Splat in WGSL

    Instanced billboards evaluate elliptical Gaussian falloff per fragment.

Performance ledger

Every optimization must earn its complexity.

Live counters above are device-specific. Entries below distinguish implemented measurements from planned experiments.

StatusChangeWhyMeasurement / gate
ImplementedFrustum rejection before sortSorting invisible splats is pure CPU and upload waste.Compare source vs visible count; prepare and sort ms remain exposed.
ImplementedCompact visible uploadThe initial baseline rebuilt and uploaded every source record.Upload/frame is shown in bytes; no hidden “optimized” claim.
ImplementedReusable staging allocationA new compact vector every frame is avoidable allocator churn.The allocation was removed, but repeated wall-clock profiles did not establish a speedup; no performance win is claimed.
BaselineCPU unstable depth sortSimple, deterministic architecture establishes a correctness baseline.Keep until sort + upload exceeds the frame budget on representative assets.
PlannedGPU preprocess + radix sortRemoves per-frame read/transform/sort pressure from the CPU at high splat counts.Adopt only after an apples-to-apples trace shows lower frame time, not just higher complexity.
PlannedCompressed resident attributesLarge dynamic scenes are usually bandwidth- and storage-sensitive.Track decoded bytes, visible quality, startup latency, and GPU memory together.
PlannedScreen-space covariance / EWAThe current billboard ellipse is a controlled approximation, not the full projected 3D covariance.Validate projected footprint and aliasing before calling the renderer 3DGS-complete.

Evidence boundary

What public material supports.

Known

Peripheral’s reconstruction research

Their public roles mention multi-view geometry, feed-forward temporal models, NeRFs, and 3D/4D Gaussian Splatting. Their Viewer role separately asks for a shared cross-platform rendering engine and spatial/video streaming.

Unknown

The production representation

No public source establishes that their live viewer uses one specific Gaussian variant, codec, sorting strategy, or renderer. CUDA and Metal are examples in the posting, not a published architecture.

Prototype choice

Why Rust + wgpu

It gives one typed rendering codebase over WebGPU in browsers and native graphics backends, which directly tests the cross-platform boundary in the Viewer role.