世界、视图、投影矩阵
3D 顶点变成屏幕上像素的过程
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
3D 对象会经历世界矩阵、视图矩阵和投影矩阵,直到它在屏幕上显示为 2D 像素。
Local Space
↓ World
World Space
↓ View
View Space
↓ Projection
Clip Space
↓ Perspective Divide
NDC
↓ Viewport
Screen
世界矩阵
将模型文件的顶点移动到游戏世界的位置、旋转和大小。 即使多个Actor使用相同的Mesh,每个Actor也有不同的世界矩阵。
查看矩阵
您可以将整个世界视为沿与相机相反的方向移动和旋转,而不是让相机看到世界上的每个物体。
相机向右移动 10
在视图中,将世界向左移动 10
View矩阵与相机Transform的逆变换有关。
投影矩阵
透视投影使远处的物体看起来更小,并将近平面和远平面之间的空间变成剪辑空间。
XMMATRIX Projection = XMMatrixPerspectiveFovLH(
XMConvertToRadians(60.0f),
Width / static_cast<float>(Height),
0.1f,
1000.0f
);
如果“Near”值太小而“Far”值太大,则深度缓冲精度可能会下降,并且可能会出现 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参数顺序和转置状态必须统一为一个规则。