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

Posted

技术标签:

【中文标题】带有 glm::frustum 闪烁的倾斜/离轴立体投影【英文标题】:Skewed / Off-axis stereoscopic projection with glm::frustum flickering 【发布时间】:2018-11-26 23:18:19 【问题描述】:

我有一个 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】:

问题是我的近端剪辑造成的。它不能设置为与 glm::perspective() 使用的相同的低值 - 它需要更多一点。

【讨论】:

以上是关于带有 glm::frustum 闪烁的倾斜/离轴立体投影的主要内容,如果未能解决你的问题,请参考以下文章

带有pdf黑色闪烁的iframe(闪烁)

css 带有CSS 3D变换的倾斜标签

带有 Gravity False 的 SpriteKit 节点倾斜到位

PHP生成带有干扰线的验证码,干扰点字符倾斜

带有 $state.includes 的 ng-show 有闪烁/闪烁 - 有角度; ui路由器

带有闪烁边框的表格单元格