Матрица MVP не работает вне шейдера?

Странная проблема здесь, я конвертировал свой текущий проект из собственных классов матрицы / вектора Qt в классы Eigen, но я столкнулся с проблемой, с которой не могу справиться.

Я рассчитываю MVP для шейдера следующим образом:

DiagonalMatrix< double, 4 > diag( Vector4d( 1.0, 1.0, -1.0, 1.0 ) );
scrMatrix_.noalias() = projMatrix_ * diag * camMatrix_.inverse();

Матрица diag инвертирует ось Z, потому что все мои математические вычисления видят, что вектор прицеливания камеры указывает на экран, но OpenGL делает обратное. В любом случае это работает, потому что сторона окна просмотра OpenGL отображается и работает нормально.

Другая сторона вывода моего окна просмотра - это двухмерное рисование наложения через систему paintEvent() Qt, например, маркировку сетки. Поэтому я использую ту же матрицу, чтобы найти трехмерное местоположение в пространстве клипа камеры:

Vector4d outVec( scrMatrix_ * ( Vector4d() << inVec, 1.0 ).finished() );

За исключением того, что я получаю совершенно неверные результаты:

inVec: 0 0 10
outVec: 11.9406 -7.20796

В этом примере я ожидал чего-то более похожего на outVec: 0.55 -0.15. Мой вершинный шейдер GLSL выполняет такие вычисления:

gl_Position = scrMatrix_ * transform * vec4( inVec, 1.0 );

В приведенных выше примерах transform - это идентичность, поэтому я не вижу никакой разницы между двумя прогнозами, но результаты совершенно разные! Я знаю, что это маловероятно, но может ли кто-нибудь увидеть, в чем я ошибаюсь?

Обновлять:

Я повторно реализовал старый (рабочий) код Qt для сравнения:

QVector3D qvec( vector( 0 ), vector( 1 ), vector( 2 ) );
QMatrix4x4 qmat( Affine3d( scrMatrix_ ).data() );
QPointF pnt = ( qvec * qmat ).toPointF() / 2.0;

Vs:

Vector4d vec( scrMatrix_ * ( Vector4d() << vector, 1.0 ).finished() );
QPointF pnt = QPointF( vec( 0 ), vec( 1 ) ) / 2.0;

Мне они идентичны, но работает только версия Qt!


person cmannett85    schedule 17.07.2011    source источник


Ответы (1)


Ну, я догадался, вам нужно масштабировать оси XYZ результирующего вектора на коэффициент масштабирования оси W (подсказки в названии ...).

Удивительно, как много Qt и OpenGL делают для вас в фоновом режиме.

person cmannett85    schedule 18.07.2011