#ply #wgpu #gaussian-splatting #point-cloud #graphics

wgpu-3dgs-viewer

A 3D Gaussian splatting viewing library written in Rust using wgpu

5 releases (3 breaking)

Uses new Rust 2024

0.4.1 Oct 1, 2025
0.4.0 Sep 20, 2025
0.3.0 May 14, 2025
0.2.0 Apr 3, 2025
0.1.0 Feb 27, 2025

#245 in WebAssembly

Download history 2/week @ 2025-07-25 130/week @ 2025-09-19 125/week @ 2025-09-26 41/week @ 2025-10-03 10/week @ 2025-10-10 8/week @ 2025-10-17

86 downloads per month

MIT/Apache

185KB
3.5K SLoC

Rust 3K SLoC // 0.0% comments WebGPU Shader Language 364 SLoC // 0.2% comments

3D Gaussian Splatting Viewer

...written in Rust using wgpu.

Crates.io Docs.rs License

Cover.gif

Overview

[!WARNING]

This library is under active development, breaking API changes between versions may occur frequently.

Use at your own risk.

This library displays 3D Gaussian Splatting models with wgpu. It includes a ready‑to‑use pipeline and modular pieces you can swap out.

  • Rendering pipeline
    • Preprocess: cull off‑screen points and set up indirect draw data.
    • Sort and draw: sort by depth and draw the Gaussians.
    • Modes: Gaussians may be displayed as splat, ellipse, or point.
    • Transforms: apply model or per-Gaussian transforms.
  • Abstraction for renderer and buffers
    • Viewer: one type that manages the buffers and pipelines.
    • Low-level access: preprocessor, sorter, renderer, and their buffers can be used separately.
  • Optional features
    • Multi-model: render many models with custom draw orders.
    • Selection: viewport selection (e.g. rectangle, brush) that marks Gaussians for editing.
  • Shaders
    • WGSL shaders packaged with WESL, you can extend or replace them.

Usage

You may read the documentation of the following types for more details:

  • Viewer: Manages buffers and renders a model.
    • Preprocessor: Culls Gaussians and fills indirect args and depths.
    • RadixSorter: Sorts Gaussians by depth on the GPU.
    • Renderer: Draws Gaussians with the selected display mode.
  • MultiModelViewer: Viewer equivalent for multiple models. Requires multi-model feature.
  • selection: Select Gaussians based on viewport interactions, e.g. rectangle or brush. Requires selection feature.

[!TIP]

The design principles of this crate are to provide modularity and flexibility to the end user of the API, which means exposing low-level WebGPU APIs. However, this means that you have to take care of your code when accessing low-level components. You risk breaking things at run-time if you don't handle them properly.

If you do not want to take the risk, consider using the higher-level wrappers and avoid any instances of passing wgpu types into functions.

Simple Viewer

You can use Viewer to render a single 3D Gaussian Splatting model:

use wgpu_3dgs_viewer as gs;
use glam::UVec2;

// Setup wgpu...

// Read the Gaussians from the .ply file
let f = std::fs::File::open(model_path).expect("ply file");
let mut reader = std::io::BufReader::new(f);
let gaussians = gs::core::Gaussians::read_ply(&mut reader).expect("gaussians");

// Create the camera
let camera = gs::Camera::new(0.1..1e4, 60f32.to_radians());

// Create the viewer
let mut viewer = gs::Viewer::new(&device, config.view_formats[0], &gaussians).expect("viewer");

// Setup camera parameters...

// Update the viewer's camera buffer
viewer.update_camera(
    &queue,
    &camera,
    UVec2::new(config.width, config.height),
);

// Create wgpu command encoder...

// Render the model
viewer.render(
    &mut encoder,
    &texture_view,
    gaussians.gaussians.len() as u32,
);

Examples

See the examples directory for usage examples.

Dependencies

This crate depends on the following crates:

wgpu-3dgs-viewer wgpu glam wesl
0.4 26.0 0.30 0.2
0.3 25.0 0.30 N/A
0.1 - 0.2 24.0 0.29 N/A

Acknowledgements

This crate uses modified code from KeKsBoTer's wgpu_sort.

References are also taken from other 3D Gaussian splatting renderer implemntations, including antimatter15's splat, KeKsBoTer's web-splat, and Aras' Unity Gaussian Splatting.

Dependencies

~23MB
~451K SLoC