![](/img/trans.png)
[英]Garbled Triangles from VBO/Shader/MVP Matrix using OpenGL 3.3
[英]MVP matrix not working outside of shader?
奇怪的问题在这里,我一直在将我当前的项目从 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 侧出现并且运行良好。
我的视口 output 的另一面是通过 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;
对比:
Vector4d vec( scrMatrix_ * ( Vector4d() << vector, 1.0 ).finished() );
QPointF pnt = QPointF( vec( 0 ), vec( 1 ) ) / 2.0;
对我来说,它们是相同的,但只有 Qt 版本有效!
好吧,我猜出来了,您需要通过 W 轴比例因子(名称中的线索......)来缩放结果向量的 XYZ 轴。
令人惊讶的是 Qt 和 OpenGL 在后台为您做了多少。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.