mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 19:02:55 +02:00
Fix culling calculations in HMD with new stereo mechanism
This commit is contained in:
parent
476e5edb32
commit
cc037c8828
5 changed files with 24 additions and 2 deletions
|
@ -1118,7 +1118,16 @@ void Application::paintGL() {
|
||||||
|
|
||||||
renderArgs._viewport = gpu::Vec4i(0, 0, size.width(), size.height());
|
renderArgs._viewport = gpu::Vec4i(0, 0, size.width(), size.height());
|
||||||
if (displayPlugin->isStereo()) {
|
if (displayPlugin->isStereo()) {
|
||||||
//_myCamera.setProjection(displayPlugin->getProjection(Mono, _myCamera.getProjection()));
|
// Stereo modes will typically have a larger projection matrix overall,
|
||||||
|
// so we ask for the 'mono' projection matrix, which for stereo and HMD
|
||||||
|
// plugins will imply the combined projection for both eyes.
|
||||||
|
//
|
||||||
|
// This is properly implemented for the Oculus plugins, but for OpenVR
|
||||||
|
// and Stereo displays I'm not sure how to get / calculate it, so we're
|
||||||
|
// just relying on the left FOV in each case and hoping that the
|
||||||
|
// overall culling margin of error doesn't cause popping in the
|
||||||
|
// right eye. There are FIXMEs in the relevant plugins
|
||||||
|
_myCamera.setProjection(displayPlugin->getProjection(Mono, _myCamera.getProjection()));
|
||||||
renderArgs._context->enableStereo(true);
|
renderArgs._context->enableStereo(true);
|
||||||
mat4 eyeViews[2];
|
mat4 eyeViews[2];
|
||||||
mat4 eyeProjections[2];
|
mat4 eyeProjections[2];
|
||||||
|
|
|
@ -136,6 +136,13 @@ void OculusLegacyDisplayPlugin::activate() {
|
||||||
_eyeOffsets[eye] = erd.HmdToEyeViewOffset;
|
_eyeOffsets[eye] = erd.HmdToEyeViewOffset;
|
||||||
eyeSizes[eye] = toGlm(ovrHmd_GetFovTextureSize(_hmd, eye, erd.Fov, 1.0f));
|
eyeSizes[eye] = toGlm(ovrHmd_GetFovTextureSize(_hmd, eye, erd.Fov, 1.0f));
|
||||||
});
|
});
|
||||||
|
ovrFovPort combined = _eyeFovs[Left];
|
||||||
|
combined.LeftTan = std::max(_eyeFovs[Left].LeftTan, _eyeFovs[Right].LeftTan);
|
||||||
|
combined.RightTan = std::max(_eyeFovs[Left].RightTan, _eyeFovs[Right].RightTan);
|
||||||
|
ovrMatrix4f ovrPerspectiveProjection =
|
||||||
|
ovrMatrix4f_Projection(combined, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP, ovrProjection_RightHanded);
|
||||||
|
_eyeProjections[Mono] = toGlm(ovrPerspectiveProjection);
|
||||||
|
|
||||||
_desiredFramebufferSize = uvec2(
|
_desiredFramebufferSize = uvec2(
|
||||||
eyeSizes[0].x + eyeSizes[1].x,
|
eyeSizes[0].x + eyeSizes[1].x,
|
||||||
std::max(eyeSizes[0].y, eyeSizes[1].y));
|
std::max(eyeSizes[0].y, eyeSizes[1].y));
|
||||||
|
|
|
@ -52,7 +52,7 @@ private:
|
||||||
ovrPosef _eyePoses[2];
|
ovrPosef _eyePoses[2];
|
||||||
ovrVector3f _eyeOffsets[2];
|
ovrVector3f _eyeOffsets[2];
|
||||||
ovrFovPort _eyeFovs[2];
|
ovrFovPort _eyeFovs[2];
|
||||||
mat4 _eyeProjections[2];
|
mat4 _eyeProjections[3];
|
||||||
mat4 _compositeEyeProjections[2];
|
mat4 _compositeEyeProjections[2];
|
||||||
uvec2 _desiredFramebufferSize;
|
uvec2 _desiredFramebufferSize;
|
||||||
ovrTexture _eyeTextures[2];
|
ovrTexture _eyeTextures[2];
|
||||||
|
|
|
@ -149,6 +149,10 @@ uvec2 OpenVrDisplayPlugin::getRecommendedRenderSize() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4 OpenVrDisplayPlugin::getProjection(Eye eye, const mat4& baseProjection) const {
|
mat4 OpenVrDisplayPlugin::getProjection(Eye eye, const mat4& baseProjection) const {
|
||||||
|
// FIXME hack to ensure that we don't crash trying to get the combined matrix
|
||||||
|
if (eye == Mono) {
|
||||||
|
eye = Left;
|
||||||
|
}
|
||||||
return _eyesData[eye]._projectionMatrix;
|
return _eyesData[eye]._projectionMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ const float DEFAULT_IPD = 0.064f;
|
||||||
const float HALF_DEFAULT_IPD = DEFAULT_IPD / 2.0f;
|
const float HALF_DEFAULT_IPD = DEFAULT_IPD / 2.0f;
|
||||||
|
|
||||||
glm::mat4 StereoDisplayPlugin::getProjection(Eye eye, const glm::mat4& baseProjection) const {
|
glm::mat4 StereoDisplayPlugin::getProjection(Eye eye, const glm::mat4& baseProjection) const {
|
||||||
|
// FIXME check for mono eye and provide a combined matrix, needed for proper
|
||||||
|
// culling
|
||||||
// Refer to http://www.nvidia.com/content/gtc-2010/pdfs/2010_gtc2010.pdf on creating
|
// Refer to http://www.nvidia.com/content/gtc-2010/pdfs/2010_gtc2010.pdf on creating
|
||||||
// stereo projection matrices. Do NOT use "toe-in", use translation.
|
// stereo projection matrices. Do NOT use "toe-in", use translation.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue