glm::frustum 闪烁的倾斜/离轴立体投影
Skewed / Off-axis stereoscopic projection with glm::frustum flickering
我有一个 3d 立体渲染应用程序,它目前使用平行立体视觉,只需将相机移动(移动)到每个左视图和右视图的一侧。它确实有效,但最近我觉得如果我有离轴选项,它会得到很大改进。我有一个 glm::frustum() 的半工作算法来允许这样做,但是当我通过 glm::perspective().
切换到它时我立即遇到了一些麻烦
我遵循了我能找到的唯一 GL 指南,Simple, Low-Cost Stereographics,它说用(2 个调用
替换我现有的 glm::perspective()
//OFF-AXIS STEREO
if (myAbj.stereoOffsetAxis) {
glm::vec3 targ0_stored = i->targO;
if (myAbj.stereoLR == 0)
{
float sgn = -1.f * (float)myAbj.stereoSwitchLR;
float eyeSep = myAbj.stereoSep;
float focalLength = 50.f;
float eyeOff = (sgn * (eyeSep / 2.f) * (myAbj.selCamLi->nearClip->val_f / focalLength));
float top = myAbj.selCamLi->nearClip->val_f * tan(myAbj.selCamLi->fov->val_f / 2.f);
float right = myAbj.aspect * top;
myAbj.selCamLi->PM = glm::frustum(-right - eyeOff, right - eyeOff, -top, top, myAbj.selCamLi->nearClip->val_f, myAbj.selCamLi->farClip->val_f);
i->targO += myAbj.selCamLi->rightO * myAbj.stereoSep * (float)myAbj.stereoSwitchLR;
VMup(i);
i->targO = targ0_stored;
}
if (myAbj.stereoLR == 1)
{
float sgn = 1.f * (float)myAbj.stereoSwitchLR;
float eyeSep = myAbj.stereoSep;
float focalLength = 50.f;
float eyeOff = (sgn * (eyeSep / 2.f) * (myAbj.selCamLi->nearClip->val_f / focalLength));
float top = myAbj.selCamLi->nearClip->val_f * tan(myAbj.selCamLi->fov->val_f / 2.f);
float right = myAbj.aspect * top;
myAbj.selCamLi->PM = glm::frustum(-right - eyeOff, right - eyeOff, -top, top, myAbj.selCamLi->nearClip->val_f, myAbj.selCamLi->farClip->val_f);
i->targO += myAbj.selCamLi->rightO * -myAbj.stereoSep * (float)myAbj.stereoSwitchLR;
VMup(i);
i->targO = targ0_stored;
}
}
使用这个等式,我的视图矩阵在 Z 轴上旋转了 180 度。然而,更大的问题是我的物体上有大量黑点和闪烁。当我将相机移动到足够近的点时,闪烁停止。即使我将场景最小化,问题仍然存在。
为什么会出现这种闪烁情况,我该怎么做才能防止这种情况发生?它毁了我的场景。
我的近剪辑导致了问题。它不能设置为与 glm::perspective() 使用的相同的低值 - 它需要多一点。
我有一个 3d 立体渲染应用程序,它目前使用平行立体视觉,只需将相机移动(移动)到每个左视图和右视图的一侧。它确实有效,但最近我觉得如果我有离轴选项,它会得到很大改进。我有一个 glm::frustum() 的半工作算法来允许这样做,但是当我通过 glm::perspective().
切换到它时我立即遇到了一些麻烦我遵循了我能找到的唯一 GL 指南,Simple, Low-Cost Stereographics,它说用(2 个调用
替换我现有的 glm::perspective()//OFF-AXIS STEREO
if (myAbj.stereoOffsetAxis) {
glm::vec3 targ0_stored = i->targO;
if (myAbj.stereoLR == 0)
{
float sgn = -1.f * (float)myAbj.stereoSwitchLR;
float eyeSep = myAbj.stereoSep;
float focalLength = 50.f;
float eyeOff = (sgn * (eyeSep / 2.f) * (myAbj.selCamLi->nearClip->val_f / focalLength));
float top = myAbj.selCamLi->nearClip->val_f * tan(myAbj.selCamLi->fov->val_f / 2.f);
float right = myAbj.aspect * top;
myAbj.selCamLi->PM = glm::frustum(-right - eyeOff, right - eyeOff, -top, top, myAbj.selCamLi->nearClip->val_f, myAbj.selCamLi->farClip->val_f);
i->targO += myAbj.selCamLi->rightO * myAbj.stereoSep * (float)myAbj.stereoSwitchLR;
VMup(i);
i->targO = targ0_stored;
}
if (myAbj.stereoLR == 1)
{
float sgn = 1.f * (float)myAbj.stereoSwitchLR;
float eyeSep = myAbj.stereoSep;
float focalLength = 50.f;
float eyeOff = (sgn * (eyeSep / 2.f) * (myAbj.selCamLi->nearClip->val_f / focalLength));
float top = myAbj.selCamLi->nearClip->val_f * tan(myAbj.selCamLi->fov->val_f / 2.f);
float right = myAbj.aspect * top;
myAbj.selCamLi->PM = glm::frustum(-right - eyeOff, right - eyeOff, -top, top, myAbj.selCamLi->nearClip->val_f, myAbj.selCamLi->farClip->val_f);
i->targO += myAbj.selCamLi->rightO * -myAbj.stereoSep * (float)myAbj.stereoSwitchLR;
VMup(i);
i->targO = targ0_stored;
}
}
使用这个等式,我的视图矩阵在 Z 轴上旋转了 180 度。然而,更大的问题是我的物体上有大量黑点和闪烁。当我将相机移动到足够近的点时,闪烁停止。即使我将场景最小化,问题仍然存在。
为什么会出现这种闪烁情况,我该怎么做才能防止这种情况发生?它毁了我的场景。
我的近剪辑导致了问题。它不能设置为与 glm::perspective() 使用的相同的低值 - 它需要多一点。