MVP矩阵不在着色器外工作?

时间:2011-07-17 21:06:46

标签: c++ opengl matrix projection eigen

奇怪的问题在这里,我一直在将我目前的项目从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侧出现并运行良好。

我的视口输出的另一面是通过Qt的paintEvent()系统进行2D叠加绘制,例如网格标注。所以我使用相同的矩阵来找到相机剪辑空间中的3D位置:

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版本有效!

1 个答案:

答案 0 :(得分:0)

好吧,我把它搞砸了,你需要按W轴比例因子(名字中的线索......)缩放得到的矢量的XYZ轴。

令人惊讶的是Qt和OpenGL在后台为你做了多少。