倾斜/离轴立体投影,带有glm :: frustum闪烁

时间:2018-11-26 23:18:19

标签: c++ opengl 3d glm-math

slide from Simple, Low-Cost Stereographics flicker

我有一个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度。但是,更大的问题是我的物体上有大量黑点和闪烁。当我将相机移到足够近的位置时,闪烁停止。即使当我最小化场景时,问题仍然存在。

为什么会出现这种闪烁现象,我该怎么做才能防止它发生?它毁了我的场景。

1 个答案:

答案 0 :(得分:0)

我附近的剪辑引起了问题。不能将其设置为与glm :: perspective()使用的相同的低值-它需要更多一点。