World, View, Projection 行列
3D頂点が画面のピクセルになる過程
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
3Dオブジェクトが画面の2Dピクセルとして表示されるまで、World、View、Projection行列を通過します。
Local Space
↓ World
World Space
↓ View
View Space
↓ Projection
Clip Space
↓ Perspective Divide
NDC
↓ Viewport
Screen
ワールドマトリックス
モデルファイルの頂点をゲームワールドの位置、回転、サイズに移動します。 同じMeshを複数のActorが使用しても、それぞれ異なるWorld行列を持つ。
View行列
カメラがワールド内のすべてのオブジェクトを見るのではなく、ワールド全体をカメラの反対方向に移動して回転すると考えることができます。
カメラが右に10移動
Viewではワールドを左に10移動
View行列はカメラTransformの逆変換と関係があります。
Projection 行列
遠近投影は遠くの物体を小さく見せ、Near PlaneとFar Planeの間の空間をClip Spaceに変える。
XMMATRIX Projection = XMMatrixPerspectiveFovLH(
XMConvertToRadians(60.0f),
Width / static_cast<float>(Height),
0.1f,
1000.0f
);
Near値が小さすぎてFar値が大きすぎると、Depth Bufferの精度が悪くなり、Z-Fightingが発生する可能性があります。
Shaderで結合する
float4 WorldPosition = mul(float4(Input.Position, 1.0f), World);
float4 ViewPosition = mul(WorldPosition, View);
Output.Position = mul(ViewPosition, Projection);
行列の順序は、使用する規約によって異なります。 DirectXMathとHLSLのメモリ配置、mul引数順、Transpose かどうかを 1 つの規則に統一しなければならない。