MVP矩阵不工作以外的着色器
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方面出现并运行良好。
我的视口输出的另一边是通过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在后台为你做了那么多的工作。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- MVP矩阵不工作以外的着色器