0

为简单起见,让我们考虑一个 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] 空间。

那么为什么要使用截锥体呢?

截锥体到剪辑空间的变形非常复杂,不需要创建透视图。

只是为了模拟具有视锥的物理相机还是有其他原因?

4

0 回答 0