Skip to the content.

Changelog - what changed in each nightly.

Contents

Terms of Use

Non-commercial use only. Unreal Universal 3D (UU3D) is provided free of charge for personal, non-commercial use. It may not be sold, licensed, rented, sublicensed, or otherwise distributed for a fee or other consideration, nor used to derive commercial gain.

No commercial affiliation or incorporation. UU3D may not be bundled with, integrated into, redistributed as part of, or otherwise presented as a component of any commercial product, service, hardware, or software offering, whether paid or provided at no cost. No company, product, or service may represent UU3D as its own work, as an official feature, or as being endorsed by, affiliated with, or supported by this project or its contributors.

All rights not expressly granted are reserved. The full terms are in LICENSE-UU3D.md; LICENSE is the notice governing the underlying UEVR framework and is unchanged by them.

Overview

UU3D can output stereo 3D directly to a screen — no headset, no SteamVR or OpenXR install — as a third runtime alongside OpenVR/OpenXR. The game renders in stereo through its normal render pipeline; instead of submitting to a VR compositor, the two eyes are woven into the game’s own backbuffer in your chosen 3D format and presented normally. Works on 3D TVs, 3D projectors, Interlaced, LeiaSR, AR glasses, Frame Sequential, and plain monitors via anaglyph output.

Download

Grab the latest nightly build from github.com/oneup03/UU3D/releases/latest — download UU3D.zip and extract it anywhere.

Ready-made game profiles live at github.com/oneup03/UU3D-Profiles — import them via Import Config below.

Injecting with UU3DI

  1. Launch the game, then open UU3DI and select the game’s process from the running-process list.
  2. Optionally Import Config to load a profile zip. The zip’s filename must exactly match the game’s exe name (e.g. Game-Win64-Shipping.zip for Game-Win64-Shipping.exe) or it won’t be associated with the game. If the zip contains a DLL plugin you’ll be asked to confirm — only accept plugins from sources you trust.
  3. Optionally adjust the settings UU3DI shows for the selected game before injecting — they’re saved to the game’s config.txt and take effect at injection.
  4. Hit Inject. From there, everything is driven from the in-game UU3D menu — press Insert to open or close it (rebindable via the menu key setting).

Legacy or Modern backend

The package ships two builds of UU3D, and the radio pair on the inject row picks which one gets injected:

  Where it lives Use it when
Legacy (default) package root The more stable of the two. Start here.
Modern modern\ subfolder A newer title doesn’t work on Legacy.

They’re built from different bases, so a game that misbehaves on one is worth retrying on the other before assuming it’s unsupported.

The choice is saved per game, in the game’s profile folder, and the radios update to match whenever you select a different process.

Auto inject

With Auto inject ticked, UU3DI watches for games once a second and injects on its own 20 seconds after one appears, then sits idle until that game exits. It’s a global setting, not per game.

A game opts in simply by having a saved profile — that is, once you’ve injected into it or changed one of its settings at least once. Games you’ve never set up are ignored, so it won’t fire on arbitrary programs.

It stands down while a UU3D session is already running (including one you injected by hand) and while UU3DI was launched with --attach=, so the two never race for the same process.

The 20-second delay is deliberate — injecting into a title that is still spinning up its renderer is a good way to get a crash. If a game needs longer than that, inject it manually instead.

The Unreal tab in one minute

3D Display composites whatever stereo pair the Unreal tab produces, so three options there matter most:

This page walks through the 3D Display tab in the UU3D menu, top to bottom.

Output Mode

Pick how the stereo pair is packed into the screen image:

Swap Eyes — flips left/right if the depth looks inverted (also flips the interlace phase for passive displays).

VSync OverrideNo-Tear Fast (default), Force On, or Use In-Game Setting. No-Tear Fast overrides the game’s own VSync: presents run uncapped at sync interval 0 with the DXGI tearing flag stripped, so a flip-model swapchain (all DX12 games) still flips on vblank only — tear-free and both eyes of an AFR-family pair land every refresh. The frame cap (t.MaxFPS) is managed automatically: twice the display refresh under Synced Sequential / AFR / AFW, native refresh under Native Stereo. (DX11 exclusive-fullscreen can still tear at interval 0 — use Force On there, or run borderless windowed.)

Force SDR Output — HDR output washes out the 3D modes and disables color correction. Leave this on unless you specifically want to experiment with HDR passthrough.

Output is always held at the display’s native resolution. To lower GPU cost, turn down the in-game resolution (or resolution scale) — that path is upscaled correctly and won’t break interlaced/checkerboard modes.

Full-width side-by-side panels (32:9)

Some 3D displays are a single ultra-wide panel — e.g. 3840×1080 (32:9), where each eye is a full 16:9 half. When Side by Side is selected on a panel wider than ~2.5:1, UU3D detects this automatically and switches to Native Render + Upscale: the game is told its window is one eye wide (via a client-rect spoof), so it renders each eye at native 16:9 instead of being squeezed to 32:9, and the two eyes are composited back across the full panel. The result is full per-eye sharpness with no configuration. It’s a no-op on ordinary half-width SbS displays (1920×1080), where the display itself stretches each half.

Because the engine believes its window is one eye wide, the game’s UI, the UU3D menu and the mouse cursor are all authored at that perceived per-eye size and composited into each eye — see the limitation in Compatibility notes for the rare title that ignores this.

3D Calibration

Three settings form one calibrated set, saved together per game:

Separation then auto-scales with the game’s live FoV (always on), so zooming or aiming down sights keeps the perceived depth constant. The game’s FoV is never overridden — only the stereo shear is injected into its own projection.

Hotkeys (hold to repeat): Ctrl+F3 / F4 depth −/+, Ctrl+F5 / F6 convergence −/+. Ctrl+F12 (or the Take 3D Screenshot button at the top of the menu) saves the composited stereo pair — the game, its own HUD, the crosshair and the stereo cursor at the current convergence, with only the UU3D menu hidden for the capture and both eyes valid even under AFR — as two PNGs under <persistent>/flat3d_screenshots/, regardless of the on-screen output mode: a canonical parallel-view (sbs_<timestamp>.png, left|right) and a cross-view companion (…_crossview.png, right|left) for cross-eyed free-viewing. The capture spans the 1–2 presents it takes to refresh both eyes with the menu hidden, so the menu briefly blinks off on screen as the shot is taken.

Depth Source

The scene-depth source for Adaptive Crosshair, HUD Depth, and Auto-Convergence:

Auto-Convergence

Automatically pulls the screen plane just in front of the nearest significant object so its pop-out never exceeds Target Disparity (a fraction of screen width). Your manual Convergence acts as the ceiling; turning this off snaps back to it.

Separation auto-scales with the pull-in, so the background stays exactly where you calibrated it. This reads the engine depth buffer (see above).

Crosshair

Put the aiming reticle at the right depth so it lands on the target instead of floating on the screen plane.

GUI

Controls the depth of the game’s 2D UI (health bars, menus, markers), the UU3D menu, and the mouse cursor.

HUD Depth Mode

Full-Screen UI Coverage % — when the game’s UI covers at least this much of the screen, HUD/crosshair depth flattens automatically. This catches full-screen menus (map, inventory, controller menus) that don’t show a mouse cursor. Raise it if a busy gameplay HUD trips it; lower it if a full-screen menu isn’t caught; 0 disables the coverage check (paused-game detection still applies).

Depth-Adaptive tuning (only shown in that mode):

GUI Depth — depth of the flat UI plane. UU3D Menu Depth — depth of the UU3D menu. Depths are relative to convergence: 1.0 = the screen plane (no shift), below 1 pops out, above 1 sits behind. Layers scale down as they shift so nothing is pushed off-screen.

Stereo Cursor — replaces the flat system cursor (which the OS would draw at screen depth in one eye only) with a proper per-eye cursor whenever the game shows one: None, GUI Depth (at the UI plane), or Geometry (Under Cursor) (lands on the scene surface right under the tip; needs a scene depth source, and falls back to GUI depth over full-screen menus). Cursor Size sets its size.

The UU3D menu’s font size is set from the main UU3D menu → Configuration → Font Size.

Head Tracking (OpenTrack)

Point OpenTrack’s UDP over network output at 127.0.0.1:<port> (default 4242). Two independent gains:

Use OpenTrack’s own Center hotkey to zero the neutral pose. Off by default and a pure no-op when disabled.

Ghost Reduction (Crosstalk)

Two sliders that reduce ghosting by compressing the signal range before it reaches the display — the standard range-compression approach from the stereo crosstalk literature. Both are off by default and both run in linear light.

Every stereo display leaks some of each eye’s image into the other, and how visible that leak is depends on the brightness difference between the eyes. Some displays also cancel crosstalk themselves, pre-subtracting part of the opposite eye; that pushes values past the ends of the range, where they get clipped, and the clipped part is what survives as a ghost.

Black Lift is applied after Contrast, so the two stack — test one at a time. The cost is real either way, so turn them only as far as the ghosting requires. SDR output only (ignored under HDR), and 3D screenshots are captured without them.

Replaces the old Color Correction (SDR) section (lift / gamma / gain plus an S-curve). That existed to fight ghosting, which this does with one slider instead of eleven. Its Flat3D_ColorCorrection, Flat3D_Lift*, Flat3D_Gamma*, Flat3D_Gain* and Flat3D_SCurve config entries are simply ignored now and are dropped the next time settings are saved.

Advanced

Compatibility notes

Thanks to