NDC(Normalized Device Coordinates,标准化设备坐标)是透视除法之后、视口变换之前的坐标空间,取值范围就是 标准立方体 里的 [−1,1]3。拿到裁剪空间坐标 (x,y,z,w) 后,除以自身的 w 就落到这里:
xndcyndczndc=xclip/wyclip/wzclip/w
这一步(顶点、图元与屏幕映射 里的透视除法)由硬件在顶点着色器之后自动完成,等价于手写 gl_Position.xyz / gl_Position.w。
它存在的理由和 标准立方体 一样:把正交、透视、各种形状的视锥体统一成同一个 [−1,1]3 的盒子,后面的 视口 变换、裁剪、光栅化 就不必知道投影是怎么来的。
- 正交投影的 w 恒为 1,除法是空操作,这也正是"正交投影没有近大远小"的数学表述
- 透视投影的 w=−zview,除法把远处的 x、y 压向中心,近大远小才真正得以实现。