MVP矩阵不工作以外的着色器

MVP matrix not working outside of shader?

本文关键字:工作 MVP      更新时间:2023-10-16

奇怪的问题在这里,我一直在转换我当前的项目从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版本有效!

我想明白了,你需要根据W轴比例因子缩放结果向量的XYZ轴(游戏邦注:从名字中可以看出)。

Qt和OpenGL在后台为你做了那么多的工作。