- OpenVR Driver (OpenXR also supported) that can render in any stereo format natively
- Compatible games play great with a XInput controller. No motion controls required!
- VRto3D itself does not "fix" games for 3D, but it allows you to run VR modded (fixed) games on a 3D Display
- Supports User Profiles for individual games
- Provides HMD Pitch and Yaw emulation for games that require it
- Currently targeting OpenVR 2.15.6.
- Runs on Windows and natively on Linux — see the Linux section for platform-specific setup
VRto3D renders one canonical 2W x H side-by-side frame internally and the active Output Mode repacks it for your display. Pick the matching output_mode either in default_config.json or from the OSD System tab (Ctrl + Home). Most modes only need the Regular Installation; the few that need extra software or display setup are called out below.
Find your display type and use the listed Output Mode(s):
3D TVs & Projectors (HDMI SbS / TaB)
- Output Modes:
SbS,TaB, or one of theFramePacked*modes - Pick
SbSorTaBbased on what your TV / projector accepts as a stereo input FramePacked*modes target HDMI 1.4 frame-packed 3D - VRto3D will attempt to engage the custom resolution, but it still relies on your display accepting it and allowing you to engage 3D:FramePacked720p60- 1280x1470 @60Hz, 30px gapFramePacked1080p24- 1920x2205 @24Hz, 45px gap (most universal)FramePacked1080p60- 1920x2205 @60Hz, 45px gap, 371.25 MHz pixel clock (HDMI 2.0+)FramePacked1080p60CVT- 1920x2205 @60Hz with CVT reduced blanking, 45px gap, 280.8 MHz pixel clock (HDMI 2.0)- For any of these modes, it is recommended to start SteamVR before starting the game, as they change monitor modes, which might break games
- For FramePacked, you can also try manually creating one of these Custom Resolutions in Nvidia Control Panel or CRU first:
- frame_packed_720p - 1280x1470, 60Hz
- horizontal: 1280 active; 110 front, 40 sync, 220 back (1650 total)
- vertical: 1470 active; 5 front, 5 sync, 20 back (1500 total)
- frame_packed_1080p - 1920x2205, 24Hz / 60Hz
- horizontal: 1920 active; 638 front, 44 sync, 148 back (2750 total)
- vertical: 2205 active; 4 front, 5 sync, 36 back (2250 total)
- May need to use CVT reduced blank specs for success with 1080 60Hz, but 60Hz is not standard and may not work at all
- horizontal: 1920 active; 48 front, 32 sync, 80 back (2080 total)
- vertical: 2205 active; 4 front, 5 sync, 36 back (2250 total)
- It may be necessary to remove other resolutions with CRU to avoid games changing the resolution. Hopefully running them in windowed mode (required for VRto3D) will prevent issues though
- More instructions and discussion are in this forum thread
- frame_packed_720p - 1280x1470, 60Hz
- Linux:
SbS,TaB, and theFramePacked*modes all work. Frame-packed timing is applied differently than on Windows:- X11 session: VRto3D applies the 1280x1470/1920x2205 custom modeline at runtime via XRandR — no EDID hacking (AMD/Intel; NVIDIA proprietary needs
ModeValidationoverrides in xorg.conf) - Wayland session: runtime custom modelines aren't possible. Generate an EDID override with
tools/make_fp_edid.pyand load it viadrm.edid_firmware=<connector>:edid/<file>.binon the kernel cmdline - Either way the HDMI 3D InfoFrame is not emitted (kernel limitation) — most 3D TVs sync to the raw timing or let you force 3D mode manually, exactly like CRU-based setups on Windows
- X11 session: VRto3D applies the 1280x1470/1920x2205 custom modeline at runtime via XRandR — no EDID hacking (AMD/Intel; NVIDIA proprietary needs
Passive / Interlaced 3D Displays
- Output Modes:
RowInterlaced,ColInterlaced, orCheckerboard RowInterlacedcovers the vast majority of passive 3D TVs and monitorsColInterlacedis for column-interlaced passive panelsCheckerboardis for DLP-link 3D projectors and the older Mitsubishi / Samsung DLP 3D TVs ((x+y)%2eye selection)- Linux: supported
AR Glasses (Rokid, Xreal, Viture, RayNeo)
- Output Mode:
SbS(switch the glasses to Full-SbS mode first) - If you don't have a USBC port with DP-Alt mode on your PC, you'll need a compatible adapter - choose one with SBS and audio support
- A USBC extension is also recommended
- Optional: install VertoXR for 6DoF or 3DoF Head Tracking
- Open VertoXR and connect to the AR glasses
- Select
Game Mode, place the glasses on a flat surface looking straight ahead, and clickStart Calibrate. Calibration may need to be redone if misalignment occurs - Edit
OpenTrack Configurationand disableEnable Rollif needed Startthe OpenTrack VertoXR plugin- Open the VRto3D OSD (
Ctrl + Home) and on theTrackingtab tickEnable OpenTrackunderOpenTrack, then setUDP Portto match VertoXR's OpenTrack port (restart SteamVR after a port change) - On the OSD
Systemtab, setLaunch Scripttostart vertoxr://steamvrso VertoXR auto-starts with OpenTrack active every time you start SteamVR - Click
Save Default Cfgin the OSD footer to persist the changes - Use the
Recenterbutton in VertoXR as needed
- Linux:
SbSoutput is supported; the optional VertoXR head-tracking app is Windows-only, so use another OpenTrack source for head tracking on Linux
Lume Pad, 3DS, Other Wireless 3D Displays
- Output Mode:
SbS - Lume Pad Requires Sunshine/Gamestream + Moonlight to stream the SbS output to the device
- 3DS Requires Sunshine/Gamestream + Moonlight with a custom resolution
- Linux: supported
SR Displays (Acer Spatial Labs / Asus Spatial Vision / Samsung Odyssey 3D)
- Output Mode:
LeiaSR(SR Display Weaver) - Install Samsung Odyssey 3D Hub or Acer TrueGame first
- Check the
Fix LeiaSR library loading (requires restart)option in the VRto3D installer- Or Manually: Open Windows Run with
Win + R, Paste this command:cmd /k setx PATH "C:\Program Files\LeiaSR\Platform\bin;%PATH%"Exit the terminal and reboot
- Or Manually: Open Windows Run with
- 6DoF head tracking is built in - just enable Open Track in the OSD
Trackingtab. Tune the LeiaSR head-tracking and track filter sliders on the same tab - Linux: not available (compiled out) - there is no Linux SR SDK in-tree
3D Vision / Frame Sequential (Shutter Glasses)
- Output Modes:
WibbleWobble(preferred) orNvidiaDX9(legacy / unstable) WibbleWobblerequires the WibbleWobbleClient - selectInstall WibbleWobble for Frame Sequential 3Din the VRto3D Installer. Follow the WibbleWobble SteamVR Setup Instructions (skip theVR Configstep, but do the rest). When framerate is low, you will have eye flickeringNvidiaDX9requires the 3DVision driver installed and 3D Enabled. May freeze or crash, requiring a hard reset. Should be more stable on single-display setups. If it crashes, just try again- For both of these modes, it is recommended to start SteamVR before starting the game, as they change monitor modes, which might break games
- Either one may require
Swap Eyesto be set depending on how your display initializes - Linux: not available (compiled out) -
NvidiaDX9has no Linux driver stack, andWibbleWobbleis a Windows-only client (a port may come later)
VR Headset (via Virtual Desktop)
- Output Mode:
VirtualDesktop - Half-height Full-SbS in a 2W x 2H window with black bars. See the Virtual Desktop setup wiki for required additional configuration
- Linux: the
VirtualDesktopoutput mode works
Dual Display Setups (Dual Projector / Dual Monitor)
- Output Modes:
DualDisplayorDualDisplayFlip - This assumes you have two displays with the same resolution that are aligned vertically. You can also use Nvidia Surround
DualDisplayputs the left eye on thedisplay_indexand the right eye on the display to the right of itDualDisplayFlipis the same asDualDisplaybut the left eye is flipped vertically - useful for mirror-based dual-monitor 3D rigs- Linux: supported
Anaglyph 3D (Color-Filter Glasses)
- Output Modes: any of the
Anaglyph*modes - works on any 2D display - Red / Cyan glasses:
AnaglyphRedCyan(simple R | GB split),AnaglyphRedCyanDubois(Dubois - best general-purpose),AnaglyphRedCyanDeghosted,AnaglyphRedCyanCompromise - Green / Magenta glasses:
AnaglyphGreenMagenta(simple G | RB split),AnaglyphGreenMagentaDubois,AnaglyphGreenMagentaDeghosted - Blue / Amber (ColorCode 3D) glasses:
AnaglyphBlueAmber - Linux: supported
2D / Mono Display
- Output Mode:
Mono - Single-eye view on any normal 2D display. Toggle
eye_swapto render the right eye instead of the left - Linux: supported
Checkout the Compatibility List to see if a game has been tested
Most adjustments now happen in the On-Screen Menu — open it with Ctrl + Home (or Start + D-Pad Down on a connected XInput controller). The remaining global hotkeys are intentionally minimal:
- Open / close the OSD menu with
Ctrl + Homeor theStart + D-Pad Downgamepad chord- Once open, the menu accepts mouse, keyboard, and gamepad navigation (D-pad / left stick to move,
Ato activate,Bto cancel the current widget,LB/RBto page through tabs, right stick to scroll) - Tap
X(Xbox) /Square(PS) to jump nav up to the title bar (where theXclose button lives — pressAto dismiss); hold the same button to enter ImGui's windowing mode (left stick moves the window, D-pad resizes it,LB/RBcycle windows)
- Once open, the menu accepts mouse, keyboard, and gamepad navigation (D-pad / left stick to move,
- Adjust Depth (Separation) with
Ctrl + F3andCtrl + F4- re-syncs the projection so the change is visible immediately (some VR mods otherwise need a reload to pick it up)- Hold
Shiftto skip the projection re-sync (bare depth nudge)
- Hold
- Adjust Convergence with
Ctrl + F5andCtrl + F6- this often has issues in VR mods - Save current Depth / Convergence / FoV (and other profile fields marked with
"+"under Configuration) to the running game'sGame.exe_config.jsonwithCtrl + F7- a beep indicates success - Reload the running game's
Game.exe_config.jsonwithCtrl + F10, or reloaddefault_config.jsonwithCtrl + Shift + F10- a beep indicates success - Toggle Auto-Depth on / off with
Ctrl + F11 - Toggle locking the SteamVR Headset Window to the foreground (and focusing the game window) with
Ctrl + F8 - Take a SbS (and Crossview) Screenshot with
Ctrl + F12 - All of the above (except
Ctrl + Home) can be disabled withdisable_hotkeysif they conflict with another 3D mod - the OSD menu remains accessible
User-defined preset hotkeys (configured under User Presets) work alongside the built-in keys above.
- Install SteamVR
- Recommended: Download
VRto3D-Installer.exefrom the latest release and run it. The installer auto-detects your Steam library, installs/updates the VRto3D driver, and offers optional cleanup of legacy ReShade and third-party SteamVR drivers. It can also install WibbleWobble and launch SteamVR for you.- Manual alternative: Download the latest VRto3D release and copy the
vrto3dfolder from inside the VRto3D.zip to yourSteam\steamapps\common\SteamVR\driversfolder
- Manual alternative: Download the latest VRto3D release and copy the
- Launch SteamVR once to generate
default_config.jsonand you should see a 1080p SbSVRto3Dwindow upscaled to fullscreen - Open the OSD menu with
Ctrl + Homeand use theSystemtab to pickDisplay Index,Output Mode, and render resolution for your display - see the Output Modes table for which mode to choose- Or edit
Steam\config\vrto3d\default_config.jsonmanually - see what each setting does - Sometimes the display selection glitches back to the wrong screen and you may have to restart SteamVR
- If your display is half-SbS or half-TaB, you can usually save some performance by reducing the per-eye render to half-resolution. (may break aspect ratio in some games)
- Or edit
- Download the latest VRto3D profiles for games and extract them to your
Steam\config\vrto3d\folder (or clickDownload Latest Profileson the OSD'sSystemtab) - Restart SteamVR to verify that you see the Headset window covering your entire display. This is usually not needed before running games.
- The Headset window should appear on the configured
display_indexdisplay
- The Headset window should appear on the configured
- Try launching a VR game
- Keyboard and Mouse are usable, but you may run into issues with accidentally clicking the wrong window or the cursor escaping the game window if the game's mouse control is coded poorly
- Enable
Lock Cursor to Game(lock_cursor) in the OSD'sSystemtab to confine the mouse to the game window, andHide Cursor(hide_cursor) to fully hide the OS cursor while the game is focused - Enable
Stereo Cursor(stereo_cursor) to replace the flat OS cursor with a per-eye 3D cursor drawn at an adjustable depth — recommended for SbS/TaB displays where the OS cursor only lines up with one eye
- Enable
- Make the game run in windowed mode either in-game settings or with
Alt + EnterThis will alleviate controller input and fullscreen issues. (Borderless fullscreen/windowed sometimes also work) - If needed, press
Ctrl + F8to lock the 3D window to the foreground and focus the game window- This is automated by default with the
auto_focussetting
- This is automated by default with the
- If game controls & audio aren't working, use
Alt + Tabto switch to the game window - To quit, exit the game and try to
Alt + Tabout- If the 3D window remains in the foreground, press
Ctrl + F8to toggle the foregrounding off, and thenAlt + Tabout
- If the 3D window remains in the foreground, press
Native Linux SteamVR driver — same direct-mode architecture as Windows, no virtual display or capture chain. The SteamVR compositor renders games into driver-allocated Vulkan images (shared via dmabuf), VRto3D repacks them into your chosen 3D format and presents fullscreen on the selected display. Configuration, profiles, the OSD, and hotkeys all work the same as on Windows; everything below is Linux-specific.
- SteamVR for Linux (Steam → SteamVR → install; ~2.16+)
- A Vulkan-capable GPU (tested: AMD/RADV on Steam Deck)
- Desktop session (X11 or Wayland). KDE, GNOME, Hyprland/Sway all work; always-on-top is guaranteed on KDE/wlroots (layer-shell) and X11.
- For hotkeys/gamepad: your user in the
inputgroup:sudo usermod -aG input $USER # then log out/in
- Download
vrto3d-linux64.tar.gzfrom the latest release, extract it, and run the installer:The script finds your Steam installation (passtar xzf vrto3d-linux64.tar.gz cd vrto3d-linux64 ./install.sh--steam <path>if it's somewhere unusual), copies the driver intoSteamVR/drivers/, registers it insteamvr.vrsettings, and warns if your user is missing theinputgroup. Run./install.sh --uninstallto remove it again. - Manual alternative: copy the
drivers/vrto3dfolder from the tarball into<steam>/steamapps/common/SteamVR/drivers/, then in~/.local/share/Steam/config/steamvr.vrsettingsset:"steamvr": { "requireHmd": true, "forcedDriver": "vrto3d", "activateMultipleDrivers": true }
Config lives in <steam>/config/vrto3d/default_config.json, same schema as Windows. Keybind names use the portable vocabulary (Key_A, Numpad7, Pad_A, Pad_Start+Pad_DPadDown); legacy VK_*/XINPUT_* names still load and are rewritten on the next profile save.
display_index picks the output (0 = primary, 1..N = connected order). The presenter is chosen by session: Wayland (layer-shell overlay surface — always on top on KDE/Hyprland/Sway, plain fullscreen on GNOME) or X11 (borderless _NET_WM_STATE_ABOVE window). Override with env VRTO3D_PRESENTER=x11|wayland (e.g. force X11/XWayland when you need runtime frame-packed modelines).
Per-output-mode Linux compatibility (including the LeiaSR / 3D Vision / WibbleWobble modes that are compiled out, and the runtime vs. EDID handling for frame-packed HDMI) is noted inline in the Output Modes table.
- Cursor lock/hide/stereo (
hide_cursor/lock_cursor/stereo_cursor) and focus stealing — no cross-client mechanism on Wayland; X11 cursor grab may come later
- VRto3D has to be installed and SteamVR launched once for
default_config.jsonto be created - The easiest way to edit settings is the in-game OSD menu (
Ctrl + Home); changes take effect immediately and the footer'sSave Default Cfg/Save Game Cfgbuttons persist them - For manual edits, modify
Steam\config\vrto3d\default_config.json- some changes require a SteamVR restart (display index, output mode, render size, OpenTrack port) - Fields with a
"+"next to them are saved to a game's profile when you pressCtrl + F7(or use the OSDSave Game Cfgfooter button), and can be reloaded from the game's profile (Ctrl + F10) ordefault_config.json(Ctrl + Shift + F10) - Reference Virtual-Key Code strings for hotkey fields
- Reference Profile Creation Steps for creating a game-specific profile
| Field Name | Type | Description | Default Value |
|---|---|---|---|
display_index |
int |
3D display selection by display order (0 = auto primary, 1 = first display, 2 = second, etc.) |
0 |
output_mode |
string |
Stereo output format. See the Output Modes table for valid values | "SbS" |
eye_swap |
bool |
Swap left and right eyes | false |
render_width |
int |
The width to render per eye | 1920 |
render_height |
int |
The height to render per eye | 1080 |
display_frequency |
float |
Per-eye refresh rate in Hz. 0.0 auto-detects from the target monitor at activation |
0.0 |
hmd_height + |
float |
The height/Z position origin of the simulated HMD | 1.0 |
hmd_x |
float |
The X position origin of the simulated HMD | 0.0 |
hmd_y |
float |
The y position origin of the simulated HMD | 0.0 |
hmd_yaw |
float |
The yaw attitude of the simulated HMD | 0.0 |
aspect_ratio |
float |
The aspect ratio used to calculate vertical FoV | 1.77778 |
fov + |
float |
The horizontal field of view (FoV) for the VR rendering | 90.0 |
depth + |
float |
The max separation. Overrides VR's IPD field | 0.1 |
convergence + |
float |
Where the left and right images converge. Adjusts frustum | 1.0 |
async_enable + |
bool |
Whether or not to use Asynchronous Reprojection. May improve or worsen smoothness | false |
auto_depth_enabled + |
bool |
Enable Auto-Depth (GPU disparity analysis caps depth so the closest object stays comfortable) | false |
auto_depth_target_disparity + |
float |
Target max on-screen disparity, as a fraction of one eye's width | 0.005 |
auto_depth_smoothing + |
float |
Auto-Depth smoothing (higher = snappier; lower = smoother) | 0.08 |
shader_enabled + |
bool |
Enable the display-correction shader pass (Lift/Gamma/Gain + S-Curve) - see Display Correction | false |
shader_lift + |
[float] |
RGB Lift (shadows), 3-element array, each 0..2 |
[1.0, 1.0, 1.0] |
shader_gamma + |
[float] |
RGB Gamma (midtones), 3-element array, each 0..2 |
[1.0, 1.0, 1.0] |
shader_gain + |
[float] |
RGB Gain (highlights), 3-element array, each 0..2 |
[1.0, 1.0, 1.0] |
shader_curve + |
float |
Extended S-Curve strength (0.33..3.0; 1.0 = pass-through; <1 reduces midtone contrast) |
1.0 |
shader_curve_offset_low + |
float |
S-Curve low-color offset (-1..1) |
0.0 |
shader_curve_offset_high + |
float |
S-Curve high-color offset (-1..1) |
0.0 |
shader_curve_offset_both + |
float |
S-Curve both-color blend-point offset (-1..1) |
0.0 |
disable_hotkeys |
bool |
Disable the global hotkeys (Depth/Convergence/profile/save) to avoid conflict with other 3D mods. Ctrl + Home and Start + D-Pad Down (OSD toggles) are unaffected |
false |
dash_enable |
bool |
Enable or disable SteamVR Dashboard and Home | false |
auto_focus |
bool |
Enable or disable automatic focusing/bringing VRto3D to foreground | true |
hide_cursor + |
bool |
Fully hide the OS cursor while the game is focused (blanks the system cursor set; restored on focus loss) | false |
lock_cursor + |
bool |
Confine the OS cursor to the focused game window's client area (re-asserted continuously) | false |
stereo_cursor + |
bool |
Hide the OS cursor and draw a per-eye 3D cursor in both eye views instead (also used for the OSD menu) | false |
cursor_depth + |
float |
Stereo cursor per-eye shift in pixels: 0 = screen plane, positive = into the screen, negative = pop-out |
0.0 |
cursor_size + |
int |
Stereo cursor arrow height in per-eye pixels | 32 |
pitch_enable + |
bool |
Enables or disables Controller right stick y-axis mapped to HMD Pitch | false |
yaw_enable + |
bool |
Enables or disables Controller right stick x-axis mapped to HMD Yaw | false |
use_open_track |
bool |
Enables or disables OpenTrack 6DoF HMD Control | false |
open_track_port |
int |
UDP Port for OpenTrack | 4242 |
use_track_filter |
bool |
Enables or disables Accela-Hamilton style pose filtering for tracking rotation and position | false |
trk_flt_rot_sens |
float |
Rotation smoothing threshold for track filter (lower = more smoothing) | 0.5 |
trk_flt_pos_sens |
float |
Position smoothing threshold for track filter (lower = more smoothing) | 0.25 |
trk_flt_rot_dz |
float |
Rotation deadzone used by track filter | 0.03 |
trk_flt_pos_dz |
float |
Position deadzone used by track filter | 0.02 |
trk_flt_zoom_smooth |
float |
Additional rotation smoothing when moving toward the display | 0.0 |
trk_flt_max_zoom |
float |
Max Z distance used for scaling zoom smoothing | 10.0 |
sr_tracking_enabled |
bool |
Enable the LeiaSR built-in head-tracking sender. Disable to feed OpenTrack from another source (e.g. the OpenTrack app) while in LeiaSR mode | true |
sr_filter_pos_mincutoff |
float |
LeiaSR built-in head tracking: One-Euro position min cutoff | 0.08 |
sr_filter_pos_beta |
float |
LeiaSR built-in head tracking: One-Euro position beta | 0.08 |
sr_filter_rot_mincutoff |
float |
LeiaSR built-in head tracking: One-Euro rotation min cutoff | 0.12 |
sr_filter_rot_beta |
float |
LeiaSR built-in head tracking: One-Euro rotation beta | 0.01 |
sr_angle_deadzone_deg |
float |
LeiaSR built-in head tracking: angular deadzone in degrees | 0.2 |
sr_sens_yaw |
float |
LeiaSR built-in head tracking: yaw sensitivity | 1.0 |
sr_sens_pitch |
float |
LeiaSR built-in head tracking: pitch sensitivity | 1.0 |
sr_sens_roll |
float |
LeiaSR built-in head tracking: roll sensitivity | 1.0 |
sr_max_yaw |
float |
LeiaSR built-in head tracking: max yaw clamp (deg) | 70.0 |
sr_max_pitch |
float |
LeiaSR built-in head tracking: max pitch clamp (deg) | 70.0 |
sr_max_roll |
float |
LeiaSR built-in head tracking: max roll clamp (deg) | 70.0 |
sr_track_mode |
string |
LeiaSR built-in head tracking mode ("XYZ_YawPitch", "XYZ", "YawPitch", "Full6DOF", "YawPitchRoll") |
"XYZ_YawPitch" |
launch_script |
string |
Command executed once when VRto3D driver activates (e.g. "start vertoxr://steamvr") |
"" |
pose_reset_key + |
string |
The Virtual-Key Code to reset the HMD position and orientation | "VK_NUMPAD7" |
ctrl_toggle_key + |
string |
The Virtual-Key Code to toggle Pitch and Yaw emulation on/off when they are enabled | "VK_NUMPAD8" |
ctrl_toggle_type + |
string |
The ctrl_toggle_key's behavior ("toggle", "hold") |
"toggle" |
pitch_radius + |
float |
Radius of curvature for the HMD to pitch along. Useful in 3rd person VR games | 0.0 |
ctrl_deadzone + |
float |
Controller Deadzone when using pitch or yaw emulation | 0.05 |
ctrl_sensitivity + |
float |
Controller Sensitivity when using pitch or yaw emulation | 1.0 |
user_settings[].user_load_key + |
string |
The Virtual-Key Code (or XInput chord) to load a user preset | "VK_NUMPAD1" |
user_settings[].user_key_type + |
string |
The load key's behavior. Only "toggle" supports multi-preset cycles; "switch" and "hold" keep just the first value |
"switch" |
user_settings[].user_depth + |
float or [float] |
The separation value(s) for a user preset (array = cycle on each press, toggle mode only) |
0.1 |
user_settings[].user_convergence + |
float or [float] |
The convergence value(s) for a user preset (array = cycle on each press, toggle mode only) |
1.0 |
user_settings[].user_fov + |
float or [float] |
The fov value(s) for a user preset; 0 falls back to the global FoV (array = cycle on each press, toggle mode only) |
90.0 |
- The game's main window has to be in focus for control input from your mouse/keyboard/controller to work. Auto Focus should do this for you, but sometimes you may need to
Alt + Tabto the game - Overlays generally won't work on this virtual HMD
- XInput controller is recommended
- SteamVR doesn't support HDR currently
- AutoHDR may work, but some games will be too dark or too bright
- DLSS, TAA, and other temporal based settings can create a halo around objects. Most VR mods have fixes for this, but some may not
-
Some 3D displays show visible left/right crosstalk in high-contrast scenes, which can make some games hard to watch. The OSD
Shadertab runs a configurable post-process pass on the final stereo image that trades some brightness/contrast for sharply less visible crosstalk - toggle it on/off instantly when needed -
Works with every output mode that produces a side-by-side internal frame (SbS, TaB, Interlaced, Checkerboard, Anaglyph, Mono, LeiaSR, NvidiaDX9, WibbleWobble, etc.)
-
Controls on the
Shadertab:Enable Display Correction Shader- master on/off (defaults off, no perf cost when off)- Lift / Gamma / Gain - per-channel RGB controls (
0..2, default1.0):RGB Liftraises/lowers shadows,RGB Gammaadjusts midtone gamma,RGB Gainscales highlights - S-Curve - extended contrast curve.
Curve(range0.33..3.0, default1.0= pass-through); below1.0reduces midtone contrast (the crosstalk-fix direction), above1.0increases it.Curve Offset (Low / High / Both)fine-tune the curve's low-end, high-end, and overall blend point (-1..1, default0) Reset to Defaults- snap everything back to pass-through
-
Example starting point for a LeiaSR 3D monitor with heavy crosstalk (Acer/Samsung 27"):
Control Value Enable Display Correction Shaderon RGB Gamma0.6, 0.6, 0.6Curve0.33Curve Offset (Both)-1.0 -
This combination strongly reduces midtone contrast (where most crosstalk is visible) while compressing the overall range. From there, tune
Curveupward toward1.0until you find the smallest correction that hides the crosstalk in your worst-case scene - every step toward1.0recovers contrast -
Save with
Save Game Cfg(per-game) orSave Default Cfg(global) in the OSD footer to persist the settings
- If you want to use Steam Input
- Open Steam->Settings->Controller
- Toggle on
Enable Steam Input for Xbox Controllers - Click
Editon theDesktop Layoutand then selectDisable Steam Input - On SteamVR's library page, click the
Controller Iconand selectDisable Steam Input - Generally you need to start SteamVR first and separately from the game for Steam Input to work
- This project is primarily targeted for VR mods of flatscreen games, not full VR games. As such, there is currently no VR controller emulation
- You can setup a Lighthouse + Vive Tracker + tracked controllers with VRto3D for a seated play area. See this guide for details
- Several VR controller only games can be made to work by using Driver4VR, a paid SteamVR Vive controller emulator. Games with mainly pointer controls work ok. Games with a lot of interaction/movement don't work well.
- Optional XInput right-stick HMD Pitch / Yaw emulation can be turned on for games or mods that need it - configure it from the OSD
Trackingtab (Ctrl + Home->XInput (Xbox) Controller)- Tick
Pitch (right stick)and / orYaw (right stick)to map them Sensitivity,Stick Deadzone, andPitch Radius(curves the view along a semicircle - useful in 3rd-person games) all live in the same panelToggle Key(defaultVK_NUMPAD8) toggles pitch/yaw on/off in-game; theModecombo next to it switches betweentoggleandholdbehavior.Reset Key(defaultVK_NUMPAD7) recenters. Both bindings accept any keyboard/mouse key or XInput button/chord - clickSetto capture a single key/button orComboto capture an XInput chord, or type a string from key_names.h directly
- Tick
- OpenTrack 6DoF / 3DoF support is available over UDP loopback - tick
Enable OpenTrackon the OSDTrackingtab (OpenTrackpanel) and set the UDP port to match your sender (default4242; port changes need a SteamVR restart)- Works alongside XInput Pitch/Yaw emulation and the HMD offsets
- SR Displays are supported natively (no bridge required) - enable OpenTrack with
output_mode: "LeiaSR"and tune the One-Euro filter / sensitivities / clamps in the OSDTrackingtab'sLeiaSR Head Trackingpanel - AR glasses are compatible via 3rd party apps like VertoXR - set the
Launch Scriptfield on the OSDSystemtab tostart vertoxr://steamvrto auto-start it with SteamVR - You can also use the OpenTrack app to do tracking with cameras, IMUs, phone apps, etc
- Track filtering of 6DoF/3DoF input can be enabled with
use_track_filter- This filter is useful for reducing jitter while preserving responsiveness through sensitivity/deadzone tuning
- Adjust filter sensitivities and deadzones from the OSD
Trackingtab
- Press
Ctrl + Home(orStart + D-Pad Downon a gamepad) to open the OSD menu and select theUser Hotkeystab - Each row maps a Load key to a
(Depth, Convergence, FoV)preset. Onlytogglemode supports multi-preset cycles -switchandholdrows are trimmed to the first value on edit and on profile load- Click
Setto capture a single key, mouse button, or XInput button - Click
Comboto capture an XInput chord (e.g.XINPUT_GAMEPAD_LEFT_SHOULDER+XINPUT_GAMEPAD_RIGHT_SHOULDER); the chord commits when you release everything - You can also type any Virtual-Key Code string into the Load field directly
- Click
- Choose the load behavior under
Mode:switch- jump to the preset and stay theretoggle- bounce between the preset and the previous setting every 1.5shold- apply the preset only while the key is held
- Edit
Depth,Conv, andFoVdirectly, or clickCopy Currentto fill them from the current Stereo tab values- Comma-separated values create a cycle - each press of the Load key advances to the next entry (
togglemode only;switchandholdkeep only the first value) FoV = 0falls back to the active profile's global FoV
- Comma-separated values create a cycle - each press of the Load key advances to the next entry (
+ Add Preset Rowadds a new empty row; theXbutton removes a row- It is recommended to keep one
switchpreset that matches your default depth/convergence so you can easily get back to baseline - If you swap between different convergence settings in-game, sometimes you will end up with black bars on the sides of the screen or you may not see a change immediately - reload/restart/reinitialize the VR mod to pick it up. Using a single convergence value across all presets in a game avoids the issue entirely
- Changes are live as soon as you edit them but only persist when you click
Save Game CfgorSave Default Cfgin the footer
- Launch the game and let VRto3D load - the OSD title bar will show
Profile: (default)if no per-game profile exists yet - Press
Ctrl + Home(orStart + D-Pad Downon a gamepad) to open the OSD menu - Stereo tab: dial in
Depth,Convergence,FoV, and toggleSwap Eyes/Auto-Depthas needed - User Hotkeys tab: add preset rows for the depth/convergence/fov values you want, bind their Load keys, and use
Copy Currentto capture the current values into a row - Tracking tab (only if the game needs it): set
HeightunderHMD Pose, and enablePitch (right stick)/Yaw (right stick)underXInput (Xbox) Controllerfor games that need camera control - System tab: toggle
Async ReprojectionunderMiscif it helps smoothness for this game - In the footer click
Save Game Cfgto writeSteam\config\vrto3d\Game.exe_config.json(the button label includes the game name and is disabled until VRto3D detects a running game).Save Default Cfgwrites the equivalent values todefault_config.jsonfor use as a global baseline - (Optional) Open the file in a text editor for final tweaks - making all convergence values match avoids rendering / performance issues, and you can hand-edit virtual-key strings or other fields the OSD doesn't expose
- Restart the game; you should hear a beep when the profile loads. Continue tuning in-OSD and re-save with
Ctrl + F7(or the footer button) at any time - Share your
Steam\config\vrto3d\Game.exe_config.jsonwith others
- If SteamVR appears on the wrong display, set
display_indexto the correct display enumeration order (or pick it from the OSDSystemtab) and restart SteamVR - If SteamVR crashes and disables add-ons, you will need to re-enable VRto3D in the SteamVR Status window
- The first thing to try is deleting your
Steam\config\steamvr.vrsettingsandSteam\config\vrto3d\default_config.json - If you have used other SteamVR drivers that also create a virtual HMD, you will need to disable and/or uninstall them
- Run SteamVR
- On the SteamVR Status window, go to
Menu -> Settings - Change to the
Startup / Shutdowntab - Click
Manage Add-Ons - Turn
Offany virtual HMD drivers (ALVR, VRidge, OpenTrack, VCR, iVRy, etc) - if issues still arise, try a Clean SteamVR Install and delete your
Steam\steamapps\common\SteamVRfolder
- Conversely, to uninstall or disable VRto3D, you can disable it under the same
Manage Add-Onsmenu or delete thevrto3dfolder from yourSteam\steamapps\common\SteamVR\driversfolder - If you have a VR headset and run into issues with this driver, here's some things to try:
- Disconnect VR headset from computer
- Clean SteamVR Install
- Set SteamVR as OpenXR Runtime
vrto3d.txtlog:<steam>/logs/vrto3d.txt(plus stderr in vrserver.txt)- No hotkeys → check
groupsincludesinput; the OSD shows a warning toast - No output window → check
WAYLAND_DISPLAY/DISPLAYreach vrserver (launch SteamVR from a desktop session, not a raw console) - Screenshots land in
<steam>/steamapps/common/SteamVR/screenshots
- Clone the code and initialize submodules
- Define
STEAM_PATHenvironment variable with the path to your main Steam folder - Open Solution in Visual Studio 2022 or VSCode
- Use the solution to build this driver
- Build output is automatically copied to your
SteamVR\driversfolder
cd vrto3d
cmake -B build -G Ninja
cmake --build build
Dependencies: gcc/clang C++17, cmake, Vulkan headers, libX11 + libXrandr, wayland-client, libxkbcommon, libdrm headers. (Shaders ship pre-compiled as SPIR-V headers; regenerate with shaders/compile_shaders.sh if you edit them — needs glslc.)
For quick iteration, register the build output in place instead of copying it:
~/.local/share/Steam/steamapps/common/SteamVR/bin/vrpathreg.sh adddriver \
<checkout>/vrto3d/build/output/drivers/vrto3d