簡體   English   中英

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 側出現並且運行良好。

我的視口 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM