gpt4 book ai didi

c++ - MVP 矩阵在着色器之外不工作?

转载 作者:太空宇宙 更新时间:2023-11-04 14:22:03 27 4
gpt4 key购买 nike

这里有一个奇怪的问题,我一直在将我当前的项目从 Qt 的原生矩阵/vector 类转换为 Eigen 的,但我遇到了一个我无法解决的问题。

我这样计算着色器的 MVP:

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

diag 矩阵反转 Z 轴,因为我所有的数学计算都看到相机的目标 vector 指向进入屏幕,但 OpenGL 做相反的事情。无论如何,这是可行的,因为视口(viewport)的 OpenGL 端出现并且运行良好。

我的视口(viewport)输出的另一面是通过 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 轴比例因子(名称中的线索......)来缩放结果 vector 的 XYZ 轴。

Qt 和 OpenGL 在后台为您做的事情多得惊人。

关于c++ - MVP 矩阵在着色器之外不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com