頂点シェーダでパースペクティブマトリックスを使用するとき、wで割るコードを書いていますか、それとも後の段階で自動的に行われますか?Perspecitveは頂点シェーダで分割しますか?
私の質問の理由は、私が使用して頂点シェーダをたくさん見てきたということです。
gl_Position = matrix * pos;
そのワット・コンポーネントでベクトルを分割後の段階がある場合は理にかなっています。
私は頂点シェーダに次のように使用するまで、私はそれが動作するようになったことはありませんが:
gl_Position = matrix * pos;
gl_Position = gl_Position/gl_Position.w;
は正しい第2の例であるか、他のいくつかの設定が不足していることだろうか?
別の言い方をすれば、OpenGL Vertex transformation(最初の画像)に示されているステップのどれを頂点シェーダーに書き込む必要がありますか?
私は、ModelViewとProjectionマトリクスがそこに属していることを知っています(またはその2つのマージ)。ビューポート変換は頂点シェーダの一部ではありませんが、divide by w
はどうですか?
私の設定は、x/y/zに対して[-1 1]以内の座標を持つ単純な三角形です。
視点行列は、z = -1から-10 =、x = [ - 1,1]、y = [ - 1,1]に座標を投影すると考えられます。
x, 0, a, 0
0, y, b, 0
0, 0, c, d
0, 0, 1, 0;
最後に、私は= P * Tは、翻訳であるT(マトリックスによって最終行列を生成する:行列Pを作るために
x = 2.0f * zNear/(xMax - xMin);
y = 2.0f * zNear/(yMax - yMin);
a = -(xMax + xMin)/(xMax - xMin);
b = -(yMax + yMin)/(yMax - yMin);
c = (zFar + zNear)/(zNear - zFar);
d = -(2.0f * zFar * zNear)/(zNear - zFar);
:
-1.0 0.0 0.0 0.0
0.0 -1.0 0.0 0.0
0.0 0.0 -1.2 -2.2
0.0 0.0 1.0 0.0
それによって生成されました0,0、-2)
私はCPU上で数学を実行しようとしましたが、期待される結果が得られるように見えますが、私はまた、手動でwで割ります。
更新:解決が、私は(乗算-1)行列内のすべてのコンポーネントを否定し、今それが動作
を理解する必要が。 上記の例では、この変更によって解決された投影面に正および負のz座標を投影することにも問題がありました。この変更によってどのような解決策が得られたかは、歓迎します。
これらの方程式がどこから得られたのかまだ分かりませんが、gluPerspectiveを見れば、あなたの 'd'値は正確には使用されていない値になります。 – Tim
数式は、最初に未知数で上に示した行列を使ってゼロから導かれました。 – hultqvist