OpenXR project settings
Exact keys and defaults, startup, reference spaces, input, extensions and diagnosis.
OpenXR project settings
Project settings describe what the engine requests from OpenXR. They neither install an XR runtime, connect a headset nor establish extension support. The keys and defaults below apply to current Reckfell 1.0.0; enable only the features you need.
Minimal startup
- Find
xr/openxr/enabledin Project Settings and enable it. For the first run, retain Head Mounted, Stereo, Stage and Opaque. - Prepare the action map at
xr/openxr/default_action_map. The current default isasset://openxr_action_map.rdata; follow the action-map guide. - Configure the XR rig and startup handling: an XRCamera3D alone does not enable XR output. Check initialization success and separately enable XR on the intended Viewport.
- Restart the application after changing startup settings. Inspect logs, the active XR runtime and actual interface capabilities; a saved checkbox is not evidence of success.
--xr-mode on forces an XR startup request; --xr-mode off disables it for a diagnostic run. Normally the editor does not start an OpenXR session merely because enabled=true. Running the game and starting the editor are different processes and stages.
For Vulkan, request OpenXR at startup: graphics-integration extensions are needed before device preparation. Do not expect a late Initialize call to repair missing startup configuration. Editing ProjectSettings during gameplay also does not automatically recreate existing instances, sessions or swapchains.
Core settings
| Key | Default | Purpose |
|---|---|---|
xr/openxr/enabled | false | Requests OpenXR startup. Requires a restart. |
xr/openxr/default_action_map | asset://openxr_action_map.rdata | Action and binding resource loaded by the interface. |
xr/openxr/form_factor | 0: Head Mounted | 1 is Handheld. Selects a requested device class, not a camera mode. |
xr/openxr/view_configuration | 1: Stereo | 0 is Mono; 2 is Stereo with Foveated Inset. The runtime must support the requested configuration. |
xr/openxr/reference_space | 1: Stage | 0 is Local; 2 is Local Floor. Selects the requested tracking space. |
xr/openxr/environment_blend_mode | 0: Opaque | 1 is Additive; 2 is Alpha. Selects environment composition. |
xr/openxr/target_api_version | empty string | Usually leave empty. Code requests OpenXR 1.1 first and tries 1.0 on API_VERSION_UNSUPPORTED. An explicit value uses major.minor.patch. This is the OpenXR API version, not the Reckfell version. |
xr/openxr/startup_alert | true | Displays a system message after unsuccessful startup initialization. false hides the dialog; it does not fix the cause. |
xr/openxr/submit_depth_buffer | false | Requests depth submission alongside color when the depth-layer extension and a suitable format are available. Guarantees no reprojection improvement. |
Do not leave the action map to an accidental fallback. If the resource fails to load, the interface creates default actions; a tools-enabled build also tries to save the resource. This does not establish that your custom actions and bindings exist. Save and inspect your own .rdata before export.
Stereo with Foveated Inset already has an implementation in current source. It is a separate view configuration with an additional inset, not a promise of support on every headset. Start an ordinary project with Stereo; do not confuse inset views with shading-density settings.
Choose a tracking space
| Mode | Consider for | Account for |
|---|---|---|
| Local | Seated experiences or UI tied to a local origin | The runtime defines the origin. It is no physical wall and does not hold the head in place. |
| Stage | Room-scale experiences and virtual locomotion | Associated with the runtime play area; useful for retaining a shared world coordinate system. |
| Local Floor | A local origin with floor height | Requires support or an available fallback; do not add head height twice. |
This is a requested mode, not an unconditional guarantee. Current code can emulate unavailable Local Floor through Local and Stage; for other unsupported requests it chooses Local. Inspect logs and the actual mode before relying on floor or recenter behavior.
OpenXRInterface.PoseRecentered reports a reference-space update after tracking has been updated. The startup guide handler only forwards the event; it does not call CenterOnHmd for you. Choose reset policy together with room-scale handling and locomotion. An unconditional additional CenterOnHmd can offset an already corrected camera again. A Stage boundary neither replaces collisions nor stops a person's physical movement.
Environment blending
Opaque displays the virtual image. Additive adds virtual light to the environment; black does not necessarily obscure the real world. Alpha uses output transparency, so check the intended Viewport.TransparentBg and scene material/background.
If the selected blend mode is unavailable, code can switch to the first supported one. Alpha can also be provided through a specialized passthrough implementation. A black view is not evidence of a broken material: check the actual blend mode, passthrough availability, permissions and target-device integration first. Selecting Alpha does not install a vendor plugin.
Foveation and quality
| Key | Default | Purpose |
|---|---|---|
xr/openxr/foveation_level | 0: Off | 1 is Low, 2 Medium, 3 High. A level request, not a guaranteed FPS improvement. |
xr/openxr/foveation_dynamic | false | Allows the runtime dynamic mode when the extension is available. |
xr/openxr/foveation_eye_tracked | true | Requests the corresponding eye-tracked foveation extension on an appropriate backend; does not automatically provide gaze poses. |
xr/openxr/foveation_with_subsampled_images | true | Permits the specialized image path when supported. Incompatible rendering features can disable it. |
xr/openxr/create_default_foveated_inset_viewport | true | Automatic inset viewport for the corresponding view configuration, not regular Stereo. |
Eye-tracked foveation and eye-gaze interaction are separate features. A true value establishes neither a sensor, permission nor an active extension. For RD, inspect Viewport VRS; a VRS map alone is also not a measurement of actual savings.
If a log says incompatible rendering features disabled subsampled images, that refers to this image path. Do not automatically extend that conclusion to every form of foveation. Compare the same frame and GPU time on the target device; do not change resolution, MSAA, effects and foveation level simultaneously.
Extensions and input
All switches in the following table default to false, except numeric values explicitly identified elsewhere.
| Key | Request |
|---|---|
xr/openxr/extensions/hand_tracking | Hand-joint data. Disabled by default in the current version. See joint reading. |
xr/openxr/extensions/hand_tracking_unobstructed_data_source | Unobstructed hand-data source when available. |
xr/openxr/extensions/hand_tracking_controller_data_source | Controller-based hand-data source when available. |
xr/openxr/extensions/hand_interaction_profile | Hand interaction profile; creates no required actions in your map. Requires a restart. |
xr/openxr/extensions/eye_gaze_interaction | Gaze interaction extension. Requires a restart; mobile also checks platform features/permissions. |
xr/openxr/extensions/render_model | Runtime-provided hardware models, subject to extension and build support. |
xr/openxr/extensions/user_presence | User-presence information when available. Does not replace session focus. |
xr/openxr/binding_modifiers/analog_threshold | Binding threshold modifiers. Configure the bindings themselves too. |
xr/openxr/binding_modifiers/dpad_binding | D-pad binding extension; requires a restart. |
A gaze pose needs a Pose action in the map: profile /interaction_profiles/ext/eye_gaze_interaction, input path /user/eyes_ext/input/gaze_ext/pose. Set XRController3D.Tracker to /user/eyes_ext and Pose to your action name. Enabling the extension alone is insufficient. This naming and route are source-reviewed, not a test of eye accuracy or device permissions.
| Key | Default | Account for |
|---|---|---|
xr/openxr/extensions/frame_synthesis | false | Requests XR_EXT_frame_synthesis. The current path requires two views; Vulkan uses Mobile. Forward+ is unsupported by this path; OpenGL has separate handling. Guarantees no stable FPS and does not repair incorrect motion vectors. |
xr/openxr/extensions/frame_synthesis/flip_y | false | Data-orientation correction for this path, not a general camera flip. |
xr/openxr/extensions/debug_utils | 0: Disabled | 1 Error, 2 Warning, 3 Info, 4 Verbose. OpenXR messages, not Vulkan validation layers. |
xr/openxr/extensions/debug_message_types | 15 | General/Validation/Performance/Conformance mask. Filters messages when debug_utils is enabled. |
Spatial environment
These keys request real-environment capabilities, not ordinary gameplay Entities. Enabling them creates no detected surfaces or saved anchors automatically. Check device support, user consent and data lifetime.
| Key | Default |
|---|---|
xr/openxr/extensions/spatial_container/enabled | false |
xr/openxr/extensions/spatial_container/bounds_mode | 0: Bounded; 1 is Immersive |
xr/openxr/extensions/spatial_container/bounds | Vector3(0.5, 0.5, 0.5) |
xr/openxr/extensions/spatial_entity/enabled | false |
xr/openxr/extensions/spatial_entity/enable_spatial_anchors | false |
xr/openxr/extensions/spatial_entity/enable_persistent_anchors | false |
xr/openxr/extensions/spatial_entity/enable_builtin_anchor_detection | false |
xr/openxr/extensions/spatial_entity/enable_plane_tracking | false |
xr/openxr/extensions/spatial_entity/enable_builtin_plane_detection | false |
xr/openxr/extensions/spatial_entity/marker_tracking/enable | false |
xr/openxr/extensions/spatial_entity/marker_tracking/enable_builtin_for_types | 0: no types; QR/Micro QR/ArUco/April tags mask |
xr/openxr/extensions/spatial_entity/marker_tracking/aruco_dict | 15: 7x7 1000 IDs |
xr/openxr/extensions/spatial_entity/marker_tracking/april_tag_dict | 3: 6x6H11 |
This is a startup-request reference, not a ready-made spatial-recognition system. The existence of these keys does not establish anchor, plane-tracking or marker-detection availability.
Startup diagnosis
| Symptom | Check first |
|---|---|
| OpenXRInterface is missing | The selected build, OpenXR module and startup log. |
| Interface exists but IsInitialized=false | Startup XR request, active runtime, device and initialization messages. An interface is not a session. |
| Game stays in a regular window | Interface startup success, UseXR on the intended Viewport and application fallback. |
| Controller exists but an action is absent | Action-map file, action type, interaction profile and exact input path. |
| No hand data | hand_tracking, runtime capabilities, permissions and validity of individual joints. |
| Wrong height or position reset | Actual reference space, fallback and absence of a second origin offset. |
| An enabled feature does not work | Support and activation of the particular extension, not just ProjectSettings. |
Verification scope
An isolated installed Reckfell 1.0.0 project with --headless --xr-mode off checked registration and defaults for 39 scalar settings, vector bounds and the presence of a borrowed uninitialized interface. All 81 observations succeeded; no project settings were written and Initialize was not called.
Startup order, enum mapping, space/blend fallbacks, extension gating and the stated limitations were reviewed against current source. This is not real-headset, loader/runtime, permission, recenter, passthrough, foveation, frame-synthesis, tracking, export or editor-UI acceptance. Engine build and SDK were unchanged.