2012-04-27 7 views
3

頂点シェーダでパースペクティブマトリックスを使用するとき、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座標を投影することにも問題がありました。

この変更によってどのような解決策が得られたかは、歓迎します。

+0

これらの方程式がどこから得られたのかまだ分かりませんが、gluPerspectiveを見れば、あなたの 'd'値は正確には使用されていない値になります。 – Tim

+0

数式は、最初に未知数で上に示した行列を使ってゼロから導かれました。 – hultqvist

答えて

4

頂点シェーダでパースペクティブを分割しないでください。後で自動的にパイプラインで行われます。

これが機能しない場合は、コードを表示したり問題を詳しく説明したりできますか?私はそれがあなたに影響を与えていることに驚いています。

+0

知っておいてよかったら、自分の問題を "解決"しないところを知っています。 – hultqvist

+1

@phq - 私はこの文によって混乱します: 'z = -1から-10まで、z = -1'です。あなたのznear/zfar引数は何ですか?gluPerspectiveまたは同等のものでこれを生成しましたか?パースペクティブ分割の前にクリッピングが行われるため、唯一の説明は、分割しない例でポリゴンがクリップされ、手動で分割しない場合です。 – Tim

+0

私は上記のコードで自分自身で行列を生成しようとしています。 z-range [-1、-10]は[1、-1]にマッピングされ、投影場所はz = -1でz軸に垂直です。 – hultqvist

関連する問題