/// <summary> /// Gets the FOV and resolution. /// </summary> public static void GetImageInfo(ref int resH, ref int resV, ref float fovH, ref float fovV) { // Always set to safe values :) resH = 1280; resV = 800; fovH = fovV = 90.0f; if (HMD == null || !SupportedPlatform) { return; } ovrHmdDesc desc = HMD.GetDesc(); ovrFovPort fov = desc.DefaultEyeFov[0]; fov.LeftTan = fov.RightTan = Mathf.Max(fov.LeftTan, fov.RightTan); fov.UpTan = fov.DownTan = Mathf.Max(fov.UpTan, fov.DownTan); // Configure Stereo settings. Default pixel density is 1.0f. float desiredPixelDensity = 1.0f; ovrSizei texSize = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, fov, desiredPixelDensity); resH = texSize.w; resV = texSize.h; fovH = 2f * Mathf.Rad2Deg * Mathf.Atan(fov.LeftTan); fovV = 2f * Mathf.Rad2Deg * Mathf.Atan(fov.UpTan); }
public override void Initialize(GraphicsDevice gd) { _gd = gd; if (gd.GetVulkanInfo(out BackendInfoVulkan vkInfo)) { IntPtr physicalDevice; ovrResult result = ovr_GetSessionPhysicalDeviceVk(_session, _luid, vkInfo.Instance, &physicalDevice); if (result != ovrResult.Success) { throw new VeldridException($"Failed to get Vulkan physical device."); } result = ovr_SetSynchonizationQueueVk(_session, vkInfo.GraphicsQueue); if (result != ovrResult.Success) { throw new VeldridException($"Failed to set the Oculus session's Vulkan synchronization queue."); } } _hmdDesc = ovr_GetHmdDesc(_session); _deviceName = _hmdDesc.ProductName.ToString(); _eyeRenderViewport = new ovrRecti[2]; _eyeSwapchains = new OculusSwapchain[2]; for (int eye = 0; eye < 2; ++eye) { ovrSizei idealSize = ovr_GetFovTextureSize( _session, (ovrEyeType)eye, _hmdDesc.DefaultEyeFov[eye], 1.0f); _eyeSwapchains[eye] = new OculusSwapchain( _gd, _session, idealSize.w, idealSize.h, Util.GetSampleCount(_options.EyeFramebufferSampleCount), createDepth: true); _eyeRenderViewport[eye].Pos.X = 0; _eyeRenderViewport[eye].Pos.Y = 0; _eyeRenderViewport[eye].Size = idealSize; } }
/// <summary> /// Get resolution of eye texture /// </summary> /// <param name="w">Width</param> /// <param name="h">Height</param> public static void GetResolutionEyeTexture(ref int w, ref int h) { if (HMD == null || !SupportedPlatform) { return; } ovrHmdDesc desc = HMD.GetDesc(); ovrFovPort[] eyeFov = new ovrFovPort[2]; eyeFov[0] = desc.DefaultEyeFov[0]; eyeFov[1] = desc.DefaultEyeFov[1]; ovrSizei recommenedTex0Size = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, desc.DefaultEyeFov[0], 1.0f); ovrSizei recommenedTex1Size = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, desc.DefaultEyeFov[1], 1.0f); w = recommenedTex0Size.w + recommenedTex1Size.w; h = (recommenedTex0Size.h + recommenedTex1Size.h) / 2; }
static void Main(string[] args) { Initialize(); IntPtr hmd = Create(0); ovrHmdDesc desc = new ovrHmdDesc(); GetDesc(hmd, ref desc); ovrSizei texture_size_left = GetFovTextureSize(hmd, ovrEyeType.ovrEye_Left, desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Left], 1.0f); ovrSizei texture_size_right = GetFovTextureSize(hmd, ovrEyeType.ovrEye_Right, desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Right], 1.0f); ovrSizei rt_size = new ovrSizei(texture_size_left.w + texture_size_right.w, (texture_size_left.h > texture_size_right.h) ? texture_size_left.h : texture_size_right.h); // Initialize eye rendering information for ovrHmd_Configure. // The viewport sizes are re-computed in case RenderTargetSize changed due to HW limitations. ovrEyeDesc[] eyes = new ovrEyeDesc[2]; eyes[0].Eye = ovrEyeType.ovrEye_Left; eyes[1].Eye = ovrEyeType.ovrEye_Right; eyes[0].Fov = desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Left]; eyes[1].Fov = desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Right]; eyes[0].TextureSize = rt_size; eyes[1].TextureSize = rt_size; eyes[0].RenderViewport.Pos = new ovrVector2i(0, 0); eyes[0].RenderViewport.Size = new ovrSizei(rt_size.w / 2, rt_size.h); eyes[1].RenderViewport.Pos = new ovrVector2i((rt_size.w + 1) / 2, 0); eyes[1].RenderViewport.Size = eyes[0].RenderViewport.Size; ovrEyeRenderDesc[] renderDesc = new ovrEyeRenderDesc[2]; ovrD3D9ConfigData renderConfigData = new ovrD3D9ConfigData(); //real pointer (IDirect3DDevice9*) to device renderConfigData.Device = (IntPtr)0; renderConfigData.Header = new ovrRenderAPIConfigHeader { API = ovrRenderAPIType.ovrRenderAPI_D3D9, Multisample = 1, RTSize = new ovrSizei(desc.Resolution.w, desc.Resolution.h) }; ovrD3D9Texture[] textures = new ovrD3D9Texture[2]; if (ConfigureRendering(hmd, ref renderConfigData, 0, ovrDistortionCaps.ovrDistortion_Chromatic | ovrDistortionCaps.ovrDistortion_TimeWarp, eyes, renderDesc)) { StartSensor(hmd, ovrHmdCapBits.ovrHmdCap_Orientation | ovrHmdCapBits.ovrHmdCap_YawCorrection | ovrHmdCapBits.ovrHmdCap_LatencyTest, 0); //while true BeginFrame(hmd, 0); for (int eyeIndex = 0; eyeIndex < (int)ovrEyeType.ovrEye_Count; eyeIndex++) { ovrEyeType eye = desc.EyeRenderOrder()[eyeIndex]; ovrPosef eyeRenderPose = BeginEyeRender(hmd, eye); ovrSensorState sensor_state = GetSensorState(hmd, 0.0); EndEyeRender(hmd, eye, eyeRenderPose, ref textures[eyeIndex]); } EndFrame(hmd); //end while StopSensor(hmd); } Shutdown(); }