All projects

Research tooling · Electronic Visualization Laboratory, UIC · 2026

UniCAVE for Unity 6

A Unity 6 port of UniCAVE, the plugin that runs one Unity application across every screen of an immersive display, extended to drive the CAVE2 and ARCADE stereo rigs at UIC's Electronic Visualization Laboratory.

  • Unity 6
  • Stereo rendering
  • Cluster rendering
  • URP Render Graph
  • C#
  • VRPN
Wireframe of part of the CAVE2's curved display wall, with lines running from the left, center and right eye of one tracked head to the corners of every screen.

UniCAVE, from the Living Environments Lab at the University of Wisconsin–Madison, is a Unity plugin for CAVEs and other displays built from many screens. Every screen gets its own Unity process, a head node keeps them in step over the network, and each process renders its screen as a window into the scene, seen from the tracked viewer’s eyes. Development stopped in 2023, on Unity 2019 and 2021 and the now-deprecated UNet networking, and the plugin no longer compiles in Unity 6.

EVL-UniCAVE is my fork: ported to Unity 6 and extended to run the two stereo rigs at UIC’s Electronic Visualization Laboratory, the CAVE2 and the ARCADE. It’s what we use to run Unity on both, and what my thesis renderer is built on.

How UniCAVE renders

A rig is described in metres, with every screen placed where it physically stands. Each process builds an off-axis frustum from each eye through the corners of its own screen, like the frusta drawn above for one head position on part of the CAVE2’s wall, so the picture stays geometrically correct as the viewer walks around. The head node reads tracking and input and broadcasts the pose to every process each frame.

What I built

  • Unity 6 port. Networking moved from UNet to Netcode for GameObjects, rendering to the Universal Render Pipeline and its Render Graph, and input to the Input System.
  • Row-interleaved passive stereo. The CAVE2’s panels are micropolarized: even and odd pixel rows reach different eyes through the glasses. Each eye renders to its own texture, and a compositing camera interleaves them in a full-screen pass that it injects into URP by itself, so a project needs no renderer setup. A per-display flag swaps the eyes on panels with flipped polarizers.
  • Several instances per machine. The CAVE2 runs 22 Unity processes on 7 nodes, one per GPU. Upstream found its own window by giving it a unique temporary resolution, falling back to the foreground window, which breaks as soon as a machine runs more than one instance. The fork looks up the window that belongs to its own process, so every instance moves onto its own column of panels.
  • Ready-made rigs. Prefabs for the CAVE2 (18 cylinder columns and 4 back-wall rows), the ARCADE (two side-by-side 3D displays on two GPUs in one PC), a single ARCADE screen and a 3D projector, with an identity baked in for every instance, so one build runs on every node.
  • Tracking and navigation. Head and wand tracking over VRPN, plus wand, gamepad and keyboard navigation, all read on the head node and broadcast so every screen moves together. A stereo/mono toggle switches all nodes at once.
  • Repeatable camera paths. Preset navigation paths that can advance by a fixed step per frame, so a run shows the same frames every time, for measurements and recordings.
  • Self-contained deployment. A post-build hook copies PowerShell launchers next to the executable. On each node they start one instance per GPU, pinned to the GPU that drives its panels; on the ARCADE they start both instances on one PC, staggered to avoid a Direct3D device-creation race.

Stack

Unity 6 (URP, Render Graph) · C# · HLSL · Netcode for GameObjects · Input System · VRPN · PowerShell

MIT licensed, like upstream UniCAVE.