![](/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.