5

頂点シェーダーでパースペクティブ マトリックスを使用する場合、w で除算するコードを記述する必要がありますか?それとも後の段階で自動的に行われますか?

私の質問の理由は、以下を使用する多くの頂点シェーダーを見てきたことです。

gl_Position = matrix * pos;

これは、ベクトルをその w コンポーネントで除算する後の段階がある場合に意味があります。

ただし、頂点シェーダーで次を使用するまで、機能することはありませんでした。

gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;

2 番目の例は正しいものですか、それとも他の設定が欠落している可能性がありますか?

別の言い方をすれば、OpenGL 頂点変換(最初の画像) に示されている手順のうち、頂点シェーダーに記述する必要があるのはどれですか?

ModelView と Projection マトリックスがそこに属していることは確かです(または2つのマージ)。ビューポート変換は頂点シェーダーの一部ではありませんが、divide by w?

私のセットアップは、x/y/z の座標が [-1 1] 以内の単純な三角形です。

Perspective マトリックスは、z=-1 から -10 までの座標を z=-1、x=[-1,1]、y=[-1,1] に投影することになっています。

-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

以下によって生成されました。

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);

行列 P を作成するには:

x, 0, a, 0
0, y, b, 0
0, 0, c, d
0, 0, 1, 0;

最後に、行列 = P * T によって最終的な行列を生成します。ここで、T は平行移動 (0,0,-2) です。

CPU で計算を試みたところ、期待どおりの結果が生成されているように見えますが、手動で w による除算も行っています。

更新:解決済みですが、理解が必要です

マトリックス内のすべてのコンポーネントを無効にし (-1 を掛けます)、今では機能します。上記の例では、正と負の両方の z 座標を投影面に投影する際にも問題がありましたが、これもこの変更によって解決されました。

この変更によって解決された理由についての参照や説明は大歓迎です。

4

1 に答える 1

5

頂点シェーダーでパースペクティブ分割を行うべきではありません。後でパイプラインで自動的に行われます。

それでも問題が解決しない場合は、コードを表示するか、問題を詳しく説明していただけますか? それがあなたに違いをもたらしていることに驚いています。

于 2012-04-27T16:23:43.067 に答える