DirectX の座標変換

World matrix

ローカル座標から、ワールド座標へ。

View matrix

ワールド座標から、カメラ(からの相対)座標へ

D3DXMatrixLookAtLH function
https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixlookatlh

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
    
 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1

カメラ位置へのワールド行列を求め、その逆行列が View matrix。カメラからの相対座標。

Projection matrix

カメラ位置から、ビューカード内の位置へ。

VS からラスタライザへ

vs で、world -> view -> projection で計算した頂点は下記ような値になり、SV_POSITION として頂点アウトプットしてラスタライザに渡される。

(-1.81066     2.41421342  3.99039908  4.0)
(1.81066    -2.41421342  3.99039908  4.0)
(-1.81066    -2.41421342  3.99039908  4.0)

ラスタライザでは、w と比較してクリッピングを行い、ビューボリューム内に頂点が含まれていることを確認。その後に、Viewport scaling matrix を適用して、描画するレンダーターゲットの位置に変換される。

(700.5888     380.5887792    3.99039908   4.0)
(1859.4112     1539.4112208     3.99039908    4.0)
(700.5888     1539.4112208     3.99039908    4.0)

同次座標のため、w で除算した結果がスクリーン上の座標になる。

(175.1472      95.1471948    0.99759977   1.0)
(464.8528     384.8528052    0.99759977   1.0)
(175.1472     384.8528052    0.99759977   1.0)

https://docs.microsoft.com/en-us/windows/win32/direct3d9/viewports-and-clipping

PS の SV_POSITION に来る値

PS Stage の float4 pos : SV_POSITION で取得できる値は、下記になる。
(175.50, 96.50, 0.9976, 4.0)

XY はスクリーン上の位置、Z は深度バッファに書き込まれる値、W は W

コメントを残す

メールアドレスが公開されることはありません。