Наклонная / внеосевая стереоскопическая проекция с мерцанием glm :: frustum - PullRequest
0 голосов
/ 27 ноября 2018

slide from Simple, Low-Cost Stereographics flicker

У меня есть приложение для 3D, стереоскопического рендеринга, которое в настоящее время использует параллельную стереоскопию, просто перемещая (сдвигая) камеру ксторона для каждого вида слева и справа.Это работает, но недавно я почувствовал, что это могло бы быть намного лучше, если бы у меня была опция вне оси.Я получил полуработающий алгоритм для glm :: frustum (), чтобы учесть это, но у меня сразу возникают проблемы, когда я переключаюсь на glm ::спектива ().

Я следовал единственному руководству по GL, которое я Простая, недорогая стереография может найти то, что должно заменить мой существующий glm ::спектива () на (2 вызова

//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;
    }
}

Используя это уравнение, моя матрица представленияповернут на 180 градусов по оси Z. Однако большая проблема заключается в большом количестве черных точек и мерцании на моих объектах. Когда я перемещаю камеру к достаточно близкой точке, мерцание прекращается. Даже когда я минимизирую сцену, проблема заключается в том, чтовсе еще там.

Почему это мерцание происходит и что я могу сделать, чтобы предотвратить его? Это разрушает мои сцены.

1 Ответ

0 голосов
/ 27 ноября 2018

Мой ближний клип вызывал проблему.Его нельзя установить на то же низкое значение, которое использовала glm ::спектива () - ему нужно немного больше.

...