A modern Rust + wgpu renderer for Resonite. Unofficial Renderide thread discussion here (in the Resonite Discord).
Also available as an AUR package.
If you're interested in supporting my work, please consider donating on Ko-Fi or GitHub Sponsors.
Experimental: performance, stability, and platform support are still evolving. Visual bugs and missing features are expected. Please report bugs you encounter and feature requests as GitHub issues.
Resonite ships with a Unity-based renderer driven by the FrooxEngine host. Renderide is a drop-in replacement for that renderer, written in Rust on top of wgpu and OpenXR. The host process is unchanged; Renderide attaches to it over shared-memory queues and takes over rendering, windowing, and XR.
The split lets the engine and renderer evolve independently and lets the renderer target Vulkan, Metal, and DirectX 12 from a single Rust codebase.
Prerequisites: a Vulkan-, Metal-, or DirectX 12-capable GPU and a Steam installation of Resonite.
-
Clone this repository and switch to the
Renderide/directory:git clone https://github.com/DoubleStyx/Renderide.git cd Renderide -
Install Rust with Rustup (if missing) and build the renderer:
cargo build --release
-
Run the launcher:
./target/release/renderide
The launcher will start the Resonite host and connect Renderide automatically.
-
Enable validation layers in the config hud to get more detailed error messages for GPU crashes. Requires a restart.
-
Logs are timestamped files under a selected logs root. Source builds normally resolve the active repository and write renderer logs to
logs/renderer/. Installed release binaries fall back to the current user's platform log root:$XDG_STATE_HOME/renderide/logsor~/.local/state/renderide/logson Linux,~/Library/Logs/Renderideon macOS, and%LOCALAPPDATA%\Renderide\logson Windows. SetRENDERIDE_LOGS_ROOTto choose the root explicitly; component logs then live underrenderer/,bootstrapper/,host/,renderer-test/, andSharedTypeGenerator/. The Renderer config HUD also shows the selected log folder and includes an "Open log folder" button. -
You can add Steam-style launch arguments after the launcher to enable mods:
<path-to-renderide> -LoadAssembly Libraries/ResoniteModLoader.dll
- Cross-platform parity - Linux, macOS, and Windows are all first-class. Mobile is a future direction; portability constraints are respected today.
- Data-driven render graph - Passes, materials, and resources route through shared systems rather than one-off code paths.
- No per-frame allocations - The hot path reuses pooled buffers and asset slots; allocation is restricted to init and asset integration.
- OpenXR-first VR - Stereo rendering and head-tracked input are part of the core path, not an afterthought.
- Profiling-friendly - Tracy CPU and GPU instrumentation is built in and zero-cost when disabled.
- Safe by default -
unsafeis restricted to FFI and justified hot paths; library code avoidsunwrap,expect, andpanic!.
Renderide runs as a sibling process to the Resonite host. The bootstrapper launches both and wires up the IPC channels:
Bootstrapper --shm queues--> Host (.NET / Resonite)
|
shm queues (Primary + Background)
|
v
Renderer (renderide-renderer)
Inside the renderer, work is organized into three layers:
- Frontend - polls IPC queues, drives the winit event loop, and runs the lock-step protocol that gates frames against the host.
- Scene - owns transforms, render spaces, mesh and skinned renderables, lights, and cameras. Pure data; does not touch wgpu.
- Backend - owns the wgpu device, asset pools, the material system, and the compiled render graph. Produces command buffers and presents.
Each tick: poll IPC, integrate a budgeted slice of pending assets, run the optional OpenXR frame loop, complete the lock-step exchange with the host, render, then present.
The workspace lives under crates/:
| Crate | Purpose |
|---|---|
bootstrapper |
Launches the Resonite host and the renderer; owns bootstrap IPC (heartbeats, clipboard, start signals). |
renderide |
The renderer itself - winit, wgpu, OpenXR, scene, render graph, materials, assets. |
renderide-shared |
Generated IPC types and the hand-maintained wire-format helpers. |
interprocess |
Cloudtoid-compatible shared-memory ring queues used by every IPC channel. |
logger |
File-first logging used by the bootstrapper, host capture, and renderer. |
renderide-test |
Integration test harness that drives the renderer end-to-end. |
A C# generator under generators/SharedTypeGenerator emits crates/renderide-shared/src/shared.rs. It is only needed when shared IPC types change.
The renderide crate exposes opt-in Cargo features for capabilities that depend on platform-specific system libraries or that are only useful in some workflows. Stock builds (cargo build) enable none of them.
Multiple features can be combined as a single space-separated argument:
```bash
cargo build --features "tracy video-textures"
CPU and GPU profiling integration. Activates profiling::scope! zones, frame marks, and wgpu-profiler GPU timestamp queries that stream into the Tracy profiler GUI on port 8086. The Tracy client links statically, so this feature has no system-library prerequisites.
cargo build --features tracySee Profiling for adapter requirements and connection details.
GStreamer-backed video texture playback. With the feature off (the default), video texture IPC commands still allocate a GPU placeholder, but no decoding runs and the placeholder stays black.
System dependencies:
- Linux:
libgstreamer1.0-devandlibgstreamer-plugins-base1.0-devon Debian/Ubuntu, or the equivalentgstreamerpackages on other distros. - macOS:
brew install gstreamer. - Windows: the official GStreamer MSVC SDK plus a working
pkg-config(pkgconfrather thanpkgconfiglite).
cargo build --features video-texturesRenderide reads its settings from a TOML file discovered (or created) at startup. The runtime watches the file and applies most changes without a restart, and the in-renderer ImGui overlay edits the same settings.
The full schema lives next to the loader in crates/renderide/src/config.
Renderide integrates with Tracy for CPU and GPU profiling.
CPU spans come from the profiling crate; GPU timestamp queries come from wgpu-profiler.
GPU timing requires TIMESTAMP_QUERY and TIMESTAMP_QUERY_INSIDE_ENCODERS adapter support.
If either is missing, a warning is logged and only CPU spans are emitted.
cargo build --profile dev-fast --features tracy-
Download the Tracy profiler GUI from the Tracy releases page and launch it.
-
Start Renderide normally (launcher or renderer directly).
-
In the Tracy GUI, connect to
localhoston port 8086.
Renderide uses Tracy's ondemand mode: data is only streamed while the GUI is connected, so
profiled builds carry near-zero runtime cost when Tracy is not attached.
Linux, macOS, and Windows are all tier-1 targets and exercised in CI (.github/workflows/). iOS and Android are not yet supported, but the codebase avoids hard dependencies on desktop-only APIs where portable alternatives exist.
Contributions are welcome. The workspace builds with the standard Cargo commands listed above; lints (cargo clippy --all-targets --all-features) and formatting (cargo fmt, plus taplo fmt when editing Cargo.toml) are expected to be clean before opening a pull request, and CI runs the same checks across all three platforms.
Read CONTRIBUTING.md to learn how to get started.
Renderide does not accept AI-generated or AI-assisted contributions. Source code, shaders, documentation, tests, issues, pull requests, and review comments submitted to this repository must be authored by the human contributor without generative AI tools. Contributors found submitting AI-generated material or using AI to participate in the project may be blocked from future contribution.
Renderide depends on upstream projects with their own contribution rules. For example, wgpu explicitly allows LLM/AI-generated code when the pull request author accepts full ownership of the change. Renderide cannot impose this policy on upstream projects or dependencies; using those dependencies does not change the policy for contributions to this repository.
MIT - see LICENSE.