diff --git a/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs b/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs
index 1190f47401..4c93117653 100644
--- a/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs
+++ b/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs
@@ -14,6 +14,14 @@ public class VRDeviceDescription
[DataMember(10)]
public VRApi Api { get; set; }
+ ///
+ /// Scales the render resolution,
+ /// note that this compounds with the user-specified resolution multiplier
+ ///
+ ///
+ /// Scales the render resolution,
+ /// note that this compounds with the user-specified resolution multiplier
+ ///
[DataMember(20)]
public float ResolutionScale { get; set; } = 1.0f;
}
diff --git a/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs b/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs
index 16a3caadb1..90b1aaf700 100644
--- a/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs
+++ b/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs
@@ -435,6 +435,12 @@ public static Texture GetMirrorTexture(GraphicsDevice device, int eyeIndex)
return tex;
}
+ public static void GetRecommendedRenderTargetSize(out (uint x, uint y) size)
+ {
+ size = default;
+ Valve.VR.OpenVR.System.GetRecommendedRenderTargetSize(ref size.x, ref size.y);
+ }
+
public static ulong CreateOverlay()
{
var layerKeyName = Guid.NewGuid().ToString();
diff --git a/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs b/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs
index 96dd9d50b8..d286b9faf2 100644
--- a/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs
+++ b/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs
@@ -25,6 +25,8 @@ internal class OpenVRHmd : VRDevice
private Vector3 currentHeadLinearVelocity;
private Vector3 currentHeadAngularVelocity;
private Quaternion currentHeadRot;
+ private (uint x, uint y) recommendedSize;
+ private GraphicsDevice device;
public override bool CanInitialize => OpenVR.InitDone || OpenVR.Init();
@@ -32,34 +34,46 @@ public OpenVRHmd()
{
VRApi = VRApi.OpenVR;
SupportsOverlays = true;
+ recommendedSize = (2160, 1200);
}
public override void Enable(GraphicsDevice device, GraphicsDeviceManager graphicsDeviceManager, bool requireMirror, int mirrorWidth, int mirrorHeight)
{
- var width = (int)(OptimalRenderFrameSize.Width * RenderFrameScaling);
+ this.device = device;
+ needsMirror = requireMirror;
+ OpenVR.GetRecommendedRenderTargetSize(out recommendedSize);
+ RebuildRenderTargets();
+ leftEyeMirror = OpenVR.GetMirrorTexture(device, 0);
+ rightEyeMirror = OpenVR.GetMirrorTexture(device, 1);
+
+ leftHandController = new OpenVRTouchController(TouchControllerHand.Left);
+ rightHandController = new OpenVRTouchController(TouchControllerHand.Right);
+
+ trackedDevices = new OpenVRTrackedDevice[Valve.VR.OpenVR.k_unMaxTrackedDeviceCount];
+ for (int i=0; i new Size2(2160, 1200);
+ public override Size2 OptimalRenderFrameSize => new Size2((int)recommendedSize.x, (int)recommendedSize.y);
public override void Dispose()
{