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 クリッピング ボリューム