为简单起见,让我们考虑一个 3D 场景,在应用模型和视图矩阵之后,所有顶点都在立方体 [-1,-1,-1]...[1,1,1] 内。
根据下图所示的几何设置,可以得出空间中一点 (X,Y,Z) 到平面 z=D 上的投影坐标 (X s , Y s ) 的公式:
从 X s / D = X / Z,得出
X s = X / (Z/D),类似地 Y s = Y / (Z/D)。
从这里我们可以构造一个齐次坐标 (x, y, z, w) = (X, Y, Z, Z/D),当转换回欧几里得空间时,将给出 (X s , Y s , D)。
这种情况下的投影矩阵 P 很简单:
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
0, 0, 1/D, 0
和 P * (X, Y, Z, 1) = (x, y, z, w)
为了让 z-test 在片段着色器中工作,可以通过指定以下内容来恢复 z 信息:
gl_FragDepth = gl_FragCoord.z / gl_FragCoord.w;
上面的代码和矩阵 P 似乎足以让所有投影几何工作。
也可以使用缩放矩阵和 P 来说明视口纵横比,并在必要时将原始场景缩放到 [-1,-1,-1]...[1,1,1] 空间。
那么为什么要使用截锥体呢?
截锥体到剪辑空间的变形非常复杂,不需要创建透视图。
只是为了模拟具有视锥的物理相机还是有其他原因?