NDC(Normalized Device Coordinates,标准化设备坐标)是透视除法之后、视口变换之前的坐标空间,取值范围就是 标准立方体 里的 [−1,1]3[-1, 1]^3。拿到裁剪空间坐标 (x,y,z,w)(x, y, z, w) 后,除以自身的 ww 就落到这里:

(xndcyndczndc)=(xclip/wyclip/wzclip/w)\begin{pmatrix} x_{ndc} \\ y_{ndc} \\ z_{ndc} \end{pmatrix} = \begin{pmatrix} x_{clip}/w \\ y_{clip}/w \\ z_{clip}/w \end{pmatrix}

这一步(顶点、图元与屏幕映射 里的透视除法)由硬件在顶点着色器之后自动完成,等价于手写 gl_Position.xyz / gl_Position.w。

它存在的理由和 标准立方体 一样:把正交、透视、各种形状的视锥体统一成同一个 [−1,1]3[-1, 1]^3 的盒子,后面的 视口 变换、裁剪、光栅化 就不必知道投影是怎么来的。

  • 正交投影的 ww 恒为 1,除法是空操作,这也正是"正交投影没有近大远小"的数学表述
  • 透视投影的 w=−zvieww = -z_{view},除法把远处的 xx、yy 压向中心,近大远小才真正得以实现。