void initGl() { GlfwApp::initGl(); ovrFovPort eyeFovPorts[2]; for_each_eye([&](ovrEyeType eye){ ovrTextureHeader & eyeTextureHeader = textures[eye].Header; eyeFovPorts[eye] = hmd->DefaultEyeFov[eye]; eyeTextureHeader.TextureSize = ovrHmd_GetFovTextureSize(hmd, eye, hmd->DefaultEyeFov[eye], 1.0f); eyeTextureHeader.RenderViewport.Size = eyeTextureHeader.TextureSize; eyeTextureHeader.RenderViewport.Pos.x = 0; eyeTextureHeader.RenderViewport.Pos.y = 0; eyeTextureHeader.API = ovrRenderAPI_OpenGL; eyeFramebuffers[eye] = FramebufferWrapperPtr(new FramebufferWrapper()); eyeFramebuffers[eye]->init(ovr::toGlm(eyeTextureHeader.TextureSize)); ((ovrGLTexture&)textures[eye]).OGL.TexId = oglplus::GetName(eyeFramebuffers[eye]->color); }); ovrGLConfig cfg; memset(&cfg, 0, sizeof(ovrGLConfig)); cfg.OGL.Header.API = ovrRenderAPI_OpenGL; cfg.OGL.Header.Multisample = 1; /** * In the Direct3D examples in the Oculus SDK, they make the point that the * onscreen window size does not need to match the Rift resolution. However * this doesn't currently work in OpenGL, so we have to create the window at * the full resolution of the Rift and ensure that we use the same * size here when setting the BackBufferSize. */ cfg.OGL.Header.BackBufferSize = ovr::fromGlm(getSize()); ON_LINUX([&]{ cfg.OGL.Disp = (Display*)glfw::getNativeDisplay(getWindow()); }); int distortionCaps = 0 | ovrDistortionCap_TimeWarp | ovrDistortionCap_Vignette; ON_LINUX([&]{ distortionCaps |= ovrDistortionCap_LinuxDevFullscreen; }); ovrEyeRenderDesc eyeRenderDescs[2]; int configResult = ovrHmd_ConfigureRendering(hmd, &cfg.Config, distortionCaps, eyeFovPorts, eyeRenderDescs); if (!configResult) { FAIL("Unable to configure SDK based distortion rendering"); } for_each_eye([&](ovrEyeType eye){ eyeOffsets[eye] = eyeRenderDescs[eye].HmdToEyeViewOffset; eyeProjections[eye] = ovr::toGlm( ovrMatrix4f_Projection(eyeFovPorts[eye], 0.01f, 1000.0f, true)); }); }
void RiftRenderingApp::initializeRiftRendering() { ovrGLConfig cfg; memset(&cfg, 0, sizeof(cfg)); cfg.OGL.Header.API = ovrRenderAPI_OpenGL; cfg.OGL.Header.BackBufferSize = ovr::fromGlm(hmdNativeResolution); cfg.OGL.Header.Multisample = 1; ON_WINDOWS([&]{ cfg.OGL.Window = (HWND)getNativeWindow(); }); int distortionCaps = 0 | ovrDistortionCap_Vignette | ovrDistortionCap_Overdrive | ovrDistortionCap_TimeWarp; ON_LINUX([&]{ distortionCaps |= ovrDistortionCap_LinuxDevFullscreen; }); ovrEyeRenderDesc eyeRenderDescs[2]; int configResult = ovrHmd_ConfigureRendering(hmd, &cfg.Config, distortionCaps, hmd->MaxEyeFov, eyeRenderDescs); assert(configResult); for_each_eye([&](ovrEyeType eye){ const ovrEyeRenderDesc & erd = eyeRenderDescs[eye]; ovrMatrix4f ovrPerspectiveProjection = ovrMatrix4f_Projection(erd.Fov, 0.01f, 100000.0f, true); projections[eye] = ovr::toGlm(ovrPerspectiveProjection); eyeOffsets[eye] = erd.HmdToEyeViewOffset; }); // Allocate the frameBuffer that will hold the scene, and then be // re-rendered to the screen with distortion glm::uvec2 frameBufferSize = ovr::toGlm(eyeTextures[0].Header.TextureSize); for_each_eye([&](ovrEyeType eye) { eyeFramebuffers[eye] = FramebufferWrapperPtr(new FramebufferWrapper()); eyeFramebuffers[eye]->init(frameBufferSize); ((ovrGLTexture&)(eyeTextures[eye])).OGL.TexId = oglplus::GetName(eyeFramebuffers[eye]->color); }); }
virtual void initGl() { RiftGlfwApp::initGl(); ovrRenderAPIConfig cfg; memset(&cfg, 0, sizeof(cfg)); cfg.Header.API = ovrRenderAPI_OpenGL; cfg.Header.BackBufferSize = ovr::fromGlm(getSize()); cfg.Header.Multisample = 1; int distortionCaps = ovrDistortionCap_Vignette; ovrEyeRenderDesc eyeRenderDescs[2]; int configResult = ovrHmd_ConfigureRendering(hmd, &cfg, distortionCaps, hmd->DefaultEyeFov, eyeRenderDescs); for_each_eye([&](ovrEyeType eye){ PerEyeArg & eyeArgs = eyes[eye]; ovrFovPort fov = hmd->DefaultEyeFov[eye]; ovrSizei texSize = ovrHmd_GetFovTextureSize(hmd, eye, fov, 1.0f); eyeArgs.framebuffer = FramebufferWrapperPtr(new FramebufferWrapper()); eyeArgs.framebuffer->init(ovr::toGlm(texSize)); ovrTextureHeader & textureHeader = eyeTextures[eye].Header; textureHeader.API = ovrRenderAPI_OpenGL; textureHeader.TextureSize = texSize; textureHeader.RenderViewport.Size = texSize; textureHeader.RenderViewport.Pos.x = 0; textureHeader.RenderViewport.Pos.y = 0; ((ovrGLTextureData&)eyeTextures[eye]).TexId = oglplus::GetName(eyeArgs.framebuffer->color); eyeArgs.modelviewOffset = glm::translate(glm::mat4(), ovr::toGlm(eyeRenderDescs[eye].HmdToEyeViewOffset)); ovrMatrix4f projection = ovrMatrix4f_Projection(fov, 0.01f, 100, true); eyeArgs.projection = ovr::toGlm(projection); }); }