遠近法の計算にはw座標が必要だからです。DirectXよりも頂点シェーダーから出力した後、wで除算して遠近法除算を実行します。
基本的に、出力頂点位置として32768、-32768、32768、65536がある場合、w除算後、0.5、-0.5、0.5、1になります。この時点で、wは不要になったため、破棄できます。次に、この情報はビューポートマトリックスを介して渡され、ビューポートマトリックスによって使用可能な2D座標に変換されます。
編集:射影行列を使用して行列の乗算がどのように実行されるかを見ると、値が正しい場所にどのように配置されるかがわかります。
D3DXMatrixPerspectiveLHで指定された射影行列を取得します
2*zn/w 0 0 0
0 2*zn/h 0 0
0 0 zf/(zf-zn) 1
0 0 zn*zf/(zn-zf) 0
そしてそれをランダムなx、y、z、1に適用します(頂点位置wは常に1になることに注意してください)頂点入力値は次のようになります
x' = ((2*zn/w) * x) + (0 * y) + (0 * z) + (0 * w)
y' = (0 * x) + ((2*zn/h) * y) + (0 * z) + (0 * w)
z' = (0 * x) + (0 * y) + ((zf/(zf-zn)) * z) + ((zn*zf/(zn-zf)) * w)
w' = (0 * x) + (0 * y) + (1 * z) + (0 * w)
すぐに、wとzが異なることがわかります。これで、w座標には、射影行列に渡されたz座標のみが含まれます。zにははるかに複雑なものが含まれています。
したがって、..入力位置が(2、1、5、1)であると仮定すると、zn(Z-Near)は1、zf(Z-Farは10)、aw(幅)は1、ah(高さ)の1。
これらの値を渡すと、次のようになります。
x' = (((2 * 1)/1) * 2
y' = (((2 * 1)/1) * 1
z' = ((10/(10-1) * 5 + ((10 * 1/(1-10)) * 1)
w' = 5
それを拡張すると、
x' = 4
y' = 2
z' = 4.4
w' = 5
次に、最終的なパースペクティブ分割を実行します。
x'' = 0.8
y'' = 0.4
z'' = 0.88
w'' = 1
これで、最終的な座標位置ができました。これは、xとyの範囲が-1から1で、zの範囲が0から1であることを前提としています。ご覧のとおり、頂点は画面上にあります。
奇妙なボーナスとして、|x'|の場合にそれを見ることができます または|y'| または|z'| |w'|より大きい または、頂点が画面外にある場合、z'が0未満です。この情報は、三角形を画面にクリップするために使用されます。
とにかく、それはかなり包括的な答えだと思います:D
Edit2:ROWメジャー行列を使用していることに注意してください。列の主要な行列が入れ替わります。