■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でビューボリュームを使う場合は、
DirectXと
OpenGLで処理を変えないといけないのかな?
OpenGLはglDepthRange()で設定した値に、(-1〜1)が
マッピングされるしくみらしい。
この値がZ値として書き込まれるのか?デフォルトは(0, 1)らしい。
DirectXでは、ViewportのMinZ, MaxZの値がこれに相当するのかな。
でも、3Dでの判定には関係ない。
ビューボリュームのNear平面が違うので気をつけないといけないということか。
どうにかして、同じ
マトリックスを使える様にできないものか…
FSAA with Blur Effects
クリッピング ボリューム