Experimental VR mod for Deus Ex: Human Revolution — Director's Cut, using the game's native AMD HD3D stereo renderer. Both eyes are rendered in the same game frame. No AER.
Gameplay stereo, headset tracking, HUD alignment, motion-controlled weapon aiming, controller buttons, and selectable interaction/walking directions have been tested in-headset. Automatic widescreen menus and several lighting, shadow and sky corrections are included. This remains an experimental prerelease; weapon visibility at extreme viewing angles and untested missions/effects still need broader testing.
Download the packaged build from Releases. GitHub's automatic source ZIP does not contain compiled DLLs.
Supported game: Steam Director's Cut 2.0.66.0, executable SHA256:
8266B6B4A5BF25F2F4E8DE068AA3720F6289C962BB1C2BB70A7B1C111BA510A1
Other executable versions and the original non-Director's Cut release are not supported by this build. Requires Windows, DirectX 11, a PC-connected headset, and an active OpenXR runtime. The initial test used the Oculus runtime. Installation does not change the system runtime.
-
Extract the release archive.
-
Close Deus Ex and connect the headset.
-
Open PowerShell in the extracted
DeusExHRVRfolder and run the following, replacing the example with your installation path:powershell -ExecutionPolicy Bypass -File .\install.ps1 -GameDirectory "E:\SteamLibrary\steamapps\common\Deus Ex Human Revolution Director's Cut"
-
Launch
DXHRDC.exeand load a save. Gameplay enters full VR automatically. Press F9 to recenter if needed.
For motion-controlled weapons, copy DeusExHRVR.ini.example beside DXHRDC.exe as DeusExHRVR.ini, set ExperimentalMotionControls=1, and restart. MotionControls=1 enables controller buttons; InteractionAim and MovementDirection independently accept Mouse, Headset, or Controller. The confirmed local setup uses WorldUnitsPerMetre=300 with both direction settings at Headset; adjust scale for comfort. Upgrading replaces both the game DLL and its companion together. Existing INI settings are preserved.
Run the installer as the Windows user who plays the game. It backs up replaced files and original graphics settings to DeusExHRVR-backup in the game folder. It enables DX11/native stereo and disables VSync and antialiasing for the tested configuration.
Keep the companion in the game's DeusExHRVR/DeusExHRVRHost.exe subfolder so it cannot load the game's 32-bit proxy DLLs.
Connect the headset before launching. The mod queries the active OpenXR runtime at startup and renders each eye at its recommended resolution, including the runtime's current resolution setting. It does not upscale the old desktop-sized image. Restart the game after changing the headset's resolution setting. If the startup query fails, the mod logs the failure and retains the game's original resolution for that run.
Complete native stereo pairs are paced by OpenXR frame requests. The desktop mirror uses a windowed, nonblocking presentation path so desktop VSync and a 60 Hz monitor do not throttle VR. The headset's selected refresh rate is retained; the mod does not switch it to the highest available rate. Runtime reprojection and GPU/CPU limits can still lower the rate of newly rendered frames.
The initial live check confirmed 1344 × 1600 per eye and approximately 90 native pairs/submissions per second on a headset set to 90 Hz. Gameplay and HUD appearance were confirmed in-headset. This is one tested configuration, not a guarantee of that performance at higher resolutions.
| Key | Action |
|---|---|
| F3 | Toggle per-eye projected light/shadow transforms (on by default) |
| F4 | Toggle per-eye shader camera inputs (on by default; requires F7) |
| F6 | Toggle tracked VR and capture a neutral head pose |
| F7 | Toggle the shared lighting-depth correction (on by default) |
| F9 | Recenter |
| F8 | Save both-eye images, camera trace, and any armed rolling recording locally |
| F10 | Toggle the rolling stereo-frame recorder (off by default) |
Full VR is enabled by default and starts automatically when gameplay loads. F6 manually toggles between full VR and the virtual screen. Gameplay accepts keyboard/mouse, physical gamepad, or the motion controllers through the game's Xbox input path.
Two independent [VR] settings choose where interaction targeting and walking point:
InteractionAim=Headset
MovementDirection=HeadsetEach accepts Mouse, Headset, or Controller (the right controller's aim). Omitted settings default to Mouse, retaining native mouse/gamepad look direction. Interaction aim selects doors and items independently of the gun. Walking uses horizontal heading only; looking up/down does not tilt movement. Controller direction works with the gun holstered and does not require the weapon experiment. Menus, virtual-screen modes and unavailable tracking retain native direction. Restart after changing settings. These direction options are experimental and need in-game validation.
Terminal interaction, hacking, the main/pause/game-over menus, sniper scope aiming, and prerecorded video playback automatically use the 16:9 virtual screen. Full VR resumes afterward unless you disabled it with F6. The screen appears in front of your current head position; VR rendering retains the headset resolution and refresh rate.
Set LockVerticalCamera=1 under [VR] in DeusExHRVR.ini to keep mouse/gamepad aiming pitch out of the full-VR camera. The gun still aims vertically, while the VR camera uses a level base plus your headset pitch. Horizontal look stays available. Virtual-screen modes, including scoped aiming, retain the native camera. The option defaults to 0 (off); restart the game after changing it.
Set MotionControls=0 under [VR] to disable all motion-controller features, including controller tracking, the weapon experiment, and controller-based interaction/walking. Headset VR and Headset direction settings stay available; Controller directions fall back to native mouse/gamepad direction. MotionControls=1 enables controller features selected by the other settings and is the default for compatibility. Restart after changing it.
ExperimentalMotionControls=1 enables a right-controller weapon experiment when MotionControls=1. It moves the equipped gun's render pose and supplies the controller muzzle to the player's firing-direction calculation. Motion-controller buttons use the Xbox bindings below; keyboard/mouse and physical gamepad input also remain available. ControllerHideArms=1 (default) hides the player's actor/arms mesh during controller aiming. It falls back to normal weapon handling in virtual-screen modes or when controller tracking is unavailable. ControllerMuzzleForwardMetres sets the muzzle distance ahead of the controller (default 0.25). Restart after changing these options. This remains experimental; alignment, shot impacts and different weapon models need in-game verification.
Motion-controller buttons emulate Xbox controller 1 when MotionControls=1; no virtual-controller driver is required. ExperimentalMotionControls controls the weapon pose separately. The mapping uses the game's default Xbox layout with Y and B exchanged:
| Motion controller | Xbox input / default game action |
|---|---|
| Left stick / click | Move / crouch |
| Right stick / quick click | Camera turn / iron sight or scope |
| Left trigger | LT / take cover |
| Right trigger | RT / fire |
| Left grip | LB / sprint |
| Right grip | RB / throw grenade |
| Left X | X / interact or reload |
| Left Y | B / non-lethal takedown; hold for lethal takedown |
| Right A | A / jump |
| Right B | Y / holster or draw; hold for quick inventory |
| Hold right-stick click + left stick | D-pad: up cloaking, down smart vision, left move silently, right Typhoon |
| Left menu: release before 1.5 seconds | Back / in-game menu |
| Left menu: hold at least 1.5 seconds | Start / pause menu, once per hold |
While right-stick click is held, the left stick sends only D-pad input. Diagonals choose the dominant direction. A quick right-stick click under 350ms still toggles scope on release if no D-pad direction was used; a longer hold sends no scope click. Menu short presses are delayed until release so a long press opens only pause. Tracking/focus loss releases the emulated inputs. MotionControls=0 disables button emulation together with all other controller features; restart to apply. Native rumble is not yet mapped to VR haptics. F8 includes a private input diagnostic log.
For an intermittent visual problem, press F10 before waiting for it, then F8 immediately after it appears. The recorder retains 360 reduced-size stereo pairs (about four seconds at 90 Hz), together with their tracking and submission data. It uses about 106 MB while armed; saving with F8 can briefly pause playback. Images and camera-history CSV files stay in the local DeusExHRVR-captures folder. F10 turns recording off again.
The HUD uses a shared plane projected through the recorded eye poses. Alignment of the health bar, minimap, and item bar has been confirmed in-headset.
Shared lighting-depth reconstruction uses the same eye frusta as world geometry. This fixes the tested hanging yellow lights; other light and shadow effects still have known stereo issues. F7 provides a live comparison while those remaining effects are investigated.
World scale is provisional. Copy DeusExHRVR.ini.example to DeusExHRVR.ini beside DXHRDC.exe to adjust it. Keep the [VR] section header; a setting outside that section is ignored. Restart the game after changing it:
[VR]
WorldUnitsPerMetre=100The accepted range is 10–1000. Higher values make the world appear smaller and increase close-range stereo depth; lower values make it appear larger and reduce depth. Physical head translation uses the same scale. To confirm that your edit was read, check unitsPerMetre= in the latest Camera hooks line in DeusExHRVR-camera.log.
The game's stereo separation/convergence sliders do not calibrate tracked VR: that path uses the headset eye poses and WorldUnitsPerMetre. The original stereo settings remain relevant to the untracked screen mode.
Close the game and run uninstall.ps1 with the same game path:
powershell -ExecutionPolicy Bypass -File .\uninstall.ps1 -GameDirectory "E:\SteamLibrary\steamapps\common\Deus Ex Human Revolution Director's Cut"The backup restores original files and graphics settings. Logs, captures, and the backup remain local.
The 32-bit game renders a double-height native texture: two complete headset-sized eyes stacked vertically. A D3D11 keyed mutex transfers the entire GPU pair to a 64-bit OpenXR companion on the same graphics adapter, which copies it into a two-slice OpenXR swapchain.
Tracking is attached to the engine scene and carried with the completed native pair. Projection submission requires both eyes to use the same recorded tracking sample. The companion signals the game after xrWaitFrame; bounded waits pace the producer and drop a whole pair on timeout. Live transport uses GPU copies; CPU readback is limited to F8 diagnostics. The original render pose remains attached to the image; further prediction and latency optimization remains future work.
Requires Visual Studio 2022 C++ tools, a Windows SDK, CMake 3.24+, and Git. CMake fetches pinned OpenXR and MinHook sources. Use separate developer shells and build directories.
In an x86 Visual Studio developer shell:
cmake -S . -B build-x86 -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build build-x86 --target atidxx32 d3d11_proxy atiadlxy DeusExHRVRCameraMathProbeIn an x64 Visual Studio developer shell:
cmake -S . -B build-x64 -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build build-x64 --target DeusExHRVRHost DeusExHRVRProbeStage d3d11.dll, atidxx32.dll, and atiadlxy.dll from build-x86/bin into dist. Stage the x64 host from build-x64/bin into dist/DeusExHRVR. The installer requires this layout.
Offline builds can set FETCHCONTENT_SOURCE_DIR_OPENXR and FETCHCONTENT_SOURCE_DIR_MINHOOK to matching dependency checkouts; exact revisions are in CMakeLists.txt.
Validation tools:
DeusExHRVRCameraMathProbe: camera-cache lifetime, tracking mailbox contention, pose conversion, inverse matrices, asymmetric eye frusta, and binocular HUD alignment. Pass a camera-history CSV path to replay scene creation/drawing through the cache.DeusExHRVRProbe: D3D11 pair bounds and GPU eye-array copies. Optional--xrrenders red/green diagnostics; use x64 with the tested runtime.DeusExHRVRTransportProbe: optional x86 target exercising the complete GPU transport. Place the x64 companion in itsDeusExHRVRsubfolder.
Component probes do not replace headset gameplay testing. Logs and F8 images are written to the game folder. Review them before sharing; they are excluded from this repository and release packages.
The stereo and adapter proxies derive from effcol/wiz3D. Thanks also to the cdcEngineDXHR reverse-engineering reference, Khronos OpenXR, and MinHook.
Distributed under LGPL 2.1. See LICENSE, THIRD_PARTY_NOTICES.md, and licenses/. No game executable or game content is included.