MVP,全称是Model-View-Projection,是计算机拿到你的模型之后,把他呈现到你屏幕上进行的变换的必要流程,将局部空间变换到裁剪空间。
graph LR
subgraph MVP变换
A["局部空间<br/>Local Space"]
A -->|"模型矩阵<br/>Model Matrix"| B["世界空间<br/>World Space"]
B -->|"视图矩阵<br/>View Matrix"| C["观察空间<br/>View Space"]
C -->|"投影矩阵<br/>Project Matrix"| D["裁剪空间<br/>Clip Space"]
end
D -->|"裁剪、透视除法<br/>(GPU自动处理)"| E["归一化设备坐标<br/>NDC"]
E -->|"视口分辨率"| F["屏幕空间<br/>Screen Space"]
分步解析
-> 局部空间 Local Space
局部空间是物体自身的坐标系,描述物体顶点相对于其自身原点的坐标。
模型矩阵 Model Matrix
模型矩阵用于将物体的局部坐标系(模型空间)转换到世界坐标系(世界空间)。其本质是一个普通的变换矩阵,包含平移、旋转、缩放的功能。-> [变换矩阵 Transformation Marices](/posts/变换矩阵 Transformation Marices)
-> 世界空间 World Space
世界空间是场景的全局坐标系,所有物体的位置、方向和大小都相对于该空间的原点。
视图矩阵 View Matrix
视图矩阵用于将场景从世界坐标系(世界空间)转换到相机坐标系(观察空间)。 -> [视图矩阵 View Matrix](/posts/视图矩阵 View Matrix)
-> 观察空间 View Space
观察空间也称为 摄像机空间(Camera Space)或 眼空间(Eye Space),它将摄像机作为坐标系的原点,同时也包含摄像机的旋转信息。
投影矩阵 Project Matrix
投影矩阵用于将相机坐标系(视图空间)中的三维坐标转换为裁剪空间(Clip Space)的二维坐标,并模拟透视效果或正交投影。 -> [投影矩阵 Project Matrix](/posts/投影矩阵 Project Matrix)
-> 裁剪空间 Clip Space
裁剪空间是MVP变换的最终结果,接下来交由GPU进行透视除法以得到NDC坐标。 -> [齐次裁剪空间 与 NDC](/posts/齐次裁剪空间 与 NDC)
MVP变换
$$ \text{gl\_Position} = \text{ProjectionMatrix} \times \text{ViewMatrix} \times \text{ModelMatrix} \times \text{VertexPosition} $$