VRto3D

Compatible 3D Displays & Output Modes

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)
Passive / Interlaced 3D Displays
AR Glasses (Rokid, Xreal, Viture, RayNeo)
Lume Pad, 3DS, Other Wireless 3D Displays
SR Displays (Acer Spatial Labs / Asus Spatial Vision / Samsung Odyssey 3D)
3D Vision / Frame Sequential (Shutter Glasses)
VR Headset (via Virtual Desktop)
Dual Display Setups (Dual Projector / Dual Monitor)
Anaglyph 3D (Color-Filter Glasses)
2D / Mono Display

Compatible VR Games & Mods

Checkout the Compatibility List to see if a game has been tested

Hotkeys

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:

User-defined preset hotkeys (configured under User Presets) work alongside the built-in keys above.

Installation

Linux

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.

Requirements

Install

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 selection & presenters

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.

Limitations

Configuration

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

Additional Settings

Display Correction (Crosstalk Reduction)

Controls

User Presets (via OSD)

Profile Creation (via OSD)

  1. Launch the game and let VRto3D load - the OSD title bar will show Profile: (default) if no per-game profile exists yet
  2. Press Ctrl + Home (or Start + D-Pad Down on a gamepad) to open the OSD menu
  3. Stereo tab: dial in Depth, Convergence, FoV, and toggle Swap Eyes / Auto-Depth as needed
  4. User Hotkeys tab: add preset rows for the depth/convergence/fov values you want, bind their Load keys, and use Copy Current to capture the current values into a row
  5. Tracking tab (only if the game needs it): set Height under HMD Pose, and enable Pitch (right stick) / Yaw (right stick) under XInput (Xbox) Controller for games that need camera control
  6. System tab: toggle Async Reprojection under Misc if it helps smoothness for this game
  7. In the footer click Save Game Cfg to write Steam\config\vrto3d\Game.exe_config.json (the button label includes the game name and is disabled until VRto3D detects a running game). Save Default Cfg writes the equivalent values to default_config.json for use as a global baseline
  8. (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
  9. 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
  10. Share your Steam\config\vrto3d\Game.exe_config.json with others

Troubleshooting

Linux

Building

Windows

Linux

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