バンダーの天にはばたくレインボー日記 このページをアンテナに追加 RSSフィード Twitter

2009-02-12(木)

[][]DirectXのPerspectiveとOpenGL Frustumの違い

DirectXのD3DXMatrixPerspectiveOffCenterRH() の場合

D3DXMatrixPerspectiveOffCenterRH 関数 ()

| 2*zn/(r-l)   0            0                0 |
| 0            2*zn*(t-b)   0                0 |
| (l+r)/(r-l)  (t+b)/(t-b)  zf/(zn-zf)      -1 |
| 0            0            zn*zf/(zn-zf)    0 |

OpenGLのglFrustum() の場合

glFrustum

| 2*zn/(r-l)   0            0                0 |
| 0            2*zn/(t-b)   0                0 |
| (l+r)/(r-l)  (t+b)/(t-b)  (zn+zf)/(zn-zf) -1 |
| 0            0            2*zn*zf/(zn-zf)  0 |

OpenGLは転置してある。


以下の要素が異なる。

1) 2*zn*(t-b) と2*zn/(t-b)

2) zf/(zn-zf) と(zn+zf)/(zn-zf)

3) zn*zf/(zn-zf) と2*zn*zf/(zn-zf)

※1)は明らかにDirectXはおかしい。


Vec3(0, 0, -zn)、Vec3(0, 0, -zf)この二つのベクトルを乗算すると。

OpenGLの方は,Vec3(0, 0, -1), Vec3(0, 0, 1)に変換されるが、DirectXの方はそうならない。

DirectXマニュアル記述が間違ってるのか、それとも実際にそういう動作をするのか?

DirectXの方は,Vec3(0, 0, 0), Vec3(0, 0, 1)に変換されるのか。


OpenGLはZが(-1〜1)、DirectXはZが(0〜1)の範囲でクリッピングされるってわけ?

この判定は、どの段階で行われてるのだろう?

描画ではGPUで判定してるはずだけど、この値は変更できるのかな。

CPUでビューボリュームを使う場合は、DirectXOpenGLで処理を変えないといけないのかな?


OpenGLはglDepthRange()で設定した値に、(-1〜1)がマッピングされるしくみらしい。

この値がZ値として書き込まれるのか?デフォルトは(0, 1)らしい。

DirectXでは、ViewportのMinZ, MaxZの値がこれに相当するのかな。

でも、3Dでの判定には関係ない。


ビューボリュームのNear平面が違うので気をつけないといけないということか。

どうにかして、同じマトリックスを使える様にできないものか…

FSAA with Blur Effects

クリッピング ボリューム

tattyutattyu 2009/02/14 00:59 この辺て隠してあったと思います>パースペクティブ
一応自分で処理するようにも出来たような。。。

banderbander 2009/02/14 05:13 シェーダーでは(x,y,z,w)値を、Pos値としてfragment shaderにわたしてるだけでしょう。
このz/wの値で、クリッピングの判定がされるわけで。
この判定の範囲は変更できるのかな?

tattyutattyu 2009/02/19 01:13 rwhを計算してる部分が隠されてるだけなんでしたっけ。
随分前の話なのでうろ覚えですw
クリッピング判定は自前じゃできなかったですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/bander/20090212/p1