Experimental native D3D11/OpenXR VR mod for Metro Exodus. Version 0.82.0.
- Automatic same-frame paired eye rendering; no alternating-eye rendering (AER).
- Head tracking and runtime per-eye projection. Most recent testing used an Oculus Rift CV1.
- Gameplay HUD and pause-menu alignment confirmed in 0.80.
- 0.82 adds a conservative native sphere-culling override to investigate disappearing world objects. It passed local tests, but its in-game improvement is not yet confirmed.
- Main-menu alignment, shadows, screen-space effects and gas-mask overlays remain unfinished. Stability is still under investigation.
This is a development checkpoint, not a finished VR conversion. The broad culling override can increase rendering cost and affect other visibility consumers.
Windows x64, Direct3D 11, audited GOG Metro Exodus 1.0.7.7 executable:
1A13595A4581E6F254B7C418E3B822242E3B8D0C3DA0BD1A5153686F35BE0EC4
Other executable versions and the Enhanced Edition are not validated. A functioning OpenXR runtime and headset are required.
Download the 0.82 release archive and extract it. Close Metro Exodus before deployment.
deploy.bat targets E:\Metro Exodus by default. For another location, run deploy.ps1 -GamePath "your game folder" in PowerShell. Deployment verifies the game executable and package hashes and preserves the previous files in an installation-backup directory.
Start MetroVRLauncher.exe from the game directory. Stereo is automatic. F7 requests a diagnostic capture; it does not toggle stereo. F8 belongs to the game's camera menu.
To undo deployment, use restore.ps1 with the backup path as described by that script's parameters.
Requires Visual Studio 2022 C++ build tools, Windows SDK, CMake 3.24 or newer, and Python 3 for dependency configuration. Run build.bat. CMake downloads pinned OpenXR SDK 1.1.62 and MinHook 1.3.4 source dependencies. Build output is placed in dist.
Configure with -DMETROVR_CAPTURE_TEST=ON to build the test programs.
MetroCaptureTestexercises paired GPU image routing, shader capture, UI correction constants, and native scratch handling. SetMETROVR_TRACE_OUTPUTto an absolute output directory, then runtools/analyze_capture.py <directory> --verify-test.MetroUIHookTestrequires a local game shader capture containing the documented crosshair/menu shader IDs. Captured game shaders are not distributed.MetroNativeVisibilityTestrequires a local fixture extracted from the audited executable. It tested all sixteen native sphere routines with real detours, including original acceptance/rejection and active/inactive override behavior. Extracted game code is not distributed.MetroFaultTestverifies that fault breadcrumbs preserve normal exception handling. Supply an output file path.
Local tests do not establish headset appearance or long-term game stability.
The preceding GPU-occlusion override did not trigger in the reported scene. 0.82 instead intercepts sixteen signature-checked native sphere-versus-plane routines. Original results are preserved until VR projection is observed; thereafter rejection is overridden. The original tests still run so sphere_tests and sphere_rejections_bypassed in status.json record the intervention. Other visibility paths may still reject geometry.
No game executable, extracted game shaders, native-code fixtures, crash dumps, or user captures are included in this repository.