View and explore 3D Gaussian Splatting scenes in immersive VR on Meta Quest 3. Load PLY files directly from device storage with high-performance GPU rendering, adaptive quality scaling, and native VR interaction including locomotion and file browsing. Built for Unity 6 with Burst-compiled async loading and OpenXR support.
Unity Project
Download the source from GitHub
README
Rendered from GitHubGaussian Splat Viewer for Quest 3
A high-performance VR application for viewing 3D Gaussian Splatting (3DGS) scenes on Meta Quest 3. Load and explore PLY files generated from tools like ml-sharp directly in immersive VR.
Features
- Native Quest 3 Support — Optimized for standalone VR with OpenXR
- High-Performance Rendering — GPU compute shaders for real-time splat processing
- Burst-Compiled Loading — Fast async PLY parsing with Unity Burst
- VR File Browser — Browse and load PLY files directly from device storage
- Adaptive Quality — Automatic performance scaling to maintain frame rate
- 6DoF Locomotion — Smooth/snap turn and continuous movement
Requirements
- Unity 6 (6000.0.x LTS)
- Meta Quest 3 (Quest 2 and Quest Pro also supported)
- Android SDK with API Level 29+
Quick Start
1. Clone the Repository
git clone https://github.com/zachdrouin/GaussianSplatViewer.git
2. Open in Unity Hub
- Open Unity Hub
- Click Add → Add project from disk
- Select the cloned folder
- Open with Unity 6 (6000.0.x LTS)
3. Build & Deploy
- Go to File → Build Settings
- Select Android and click Switch Platform
- Connect your Quest 3 via USB
- Click Build and Run
See SETUP_GUIDE.md for detailed configuration instructions.
Project Structure
Assets/GaussianSplatViewer/
├── Runtime/
│ ├── Core/ # PLY loading & data structures
│ │ ├── GaussianSplatAsset.cs
│ │ ├── GaussianSplatRenderer.cs
│ │ ├── PLYLoader.cs
│ │ └── CoordinateConverter.cs
│ ├── Rendering/ # URP render pipeline integration
│ │ ├── GaussianSplatPass.cs
│ │ ├── SplatSorter.cs
│ │ └── SplatCuller.cs
│ ├── VR/ # XR interaction & locomotion
│ │ ├── VRRigController.cs
│ │ └── VRLocomotion.cs
│ ├── UI/ # VR file browser UI
│ │ ├── VRFileBrowser.cs
│ │ └── FileSystemAccessor.cs
│ ├── Optimization/ # LOD & streaming
│ │ ├── SplatLODManager.cs
│ │ └── ChunkStreamingManager.cs
│ └── GaussianSplatViewerApp.cs
├── Shaders/
│ ├── GaussianSplat.shader # Main splat rendering shader
│ ├── GaussianSplatting.hlsl # Shader includes
│ ├── GaussianSplatCompute.compute
│ └── RadixSort.compute
└── Scenes/
└── SceneSetupGuide.cs
Architecture
Rendering Pipeline
PLY File → PLYLoader (Burst) → GaussianSplatAsset → GPU Buffers
↓
Camera → GaussianSplatPass → Preprocess Compute → Sort → Draw Instanced
- PLYLoader — Parses binary PLY files using Burst-compiled jobs
- GaussianSplatRenderer — Manages GPU buffers and rendering state
- GaussianSplatPass — URP ScriptableRenderPass for the render pipeline
- Compute Shaders — Preprocess splats, frustum cull, and radix sort by depth
Key Components
| Component | Description |
|---|---|
GaussianSplatViewerApp |
Main application controller, coordinates all systems |
GaussianSplatRenderer |
Core renderer, handles loading and GPU buffer management |
PLYLoader |
High-performance binary PLY parser with Burst |
GaussianSplatPass |
URP render pass for splat rendering |
VRRigController |
XR Origin management and tracking |
VRFileBrowser |
World-space UI for file selection |
Usage
Loading PLY Files
Transfer PLY files to your Quest via ADB:
adb push /path/to/scene.ply /sdcard/Download/
In the app:
- Press the Menu button (left controller) to open file browser
- Navigate to your PLY file
- Select to load
Controls
| Input | Action |
|---|---|
| Left Thumbstick | Move |
| Right Thumbstick | Turn (snap/smooth) |
| Left Menu Button | Toggle file browser |
| A Button | Reset view |
| Trigger | UI selection |
Performance
Optimized for Quest 3's Snapdragon XR2 Gen 2:
- Target: 72 FPS (90 FPS mode available)
- Max Splats: 400,000 visible (configurable)
- Adaptive Quality: Auto-adjusts splat scale based on frame time
- Single-Pass Stereo: Efficient VR rendering
Performance Tips
- Keep PLY files under 1M Gaussians for best performance
- Use binary PLY format (ASCII not supported)
- Reduce
Max Visible Splatsin renderer settings if needed
Dependencies
| Package | Version | Purpose |
|---|---|---|
| Universal RP | 17.0.3+ | Render pipeline |
| XR Interaction Toolkit | 3.0.7+ | VR interactions |
| OpenXR Plugin | 1.14.0+ | XR runtime |
| Meta OpenXR | 2.1.0+ | Quest support |
| Burst | 1.8.18+ | High-performance jobs |
| Input System | 1.11.2+ | New input handling |
Troubleshooting
Black Screen on Quest
- Verify OpenXR is enabled in XR Plug-in Management
- Check Meta Quest Support feature is enabled
- Ensure Vulkan is the only Graphics API
Splats Not Rendering
- Add GaussianSplatRendererFeature to URP Renderer Asset
- Assign compute shaders and material in the feature settings
- Check that
GaussianSplatRenderercomponent is in scene
Poor Performance
- Reduce
Max Visible Splatsto 200,000 - Disable MSAA in URP settings
- Lower render scale to 0.8
License
MIT License — see LICENSE for details.
Acknowledgments
- 3D Gaussian Splatting — Original research
- Unity XR Interaction Toolkit — VR framework
Versions 0
No versions tracked yet.
Dependencies 20
Changelog 0 releases
No changelog entries yet. Run the admin Changelog & Version Scanner to pull from the repository's CHANGELOG.md.
Comments
No comments yet. Be the first!


Sign in to join the conversation
Sign In