【发布时间】:2018-03-30 09:22:12
【问题描述】:
根据一些来源,NDC 与剪辑空间的不同之处在于,NDC 只是被 W 分量除后的剪辑空间。基元在剪辑空间中被剪辑,在 OpenGL 中沿 X、Y 和 Z 轴为 -1 到 1(编辑:这是错误的,请参阅答案)。换句话说,剪辑空间是一个立方体。裁剪是在这个立方体内完成的。如果它落在里面,它是可见的,如果它落在外面,它是不可见的。
让我们举这个简单的例子,我们在视锥上从上向下看,沿着负 Y 轴。 HALFFOV 是 45 度,这意味着 NEAR 和 RIGHT 都相同(在这种情况下长度为 2)。示例点为 (6, 0, -7)。
现在,这里是透视投影矩阵:
为简单起见,我们将使用 1:1 的纵横比。所以:
RIGHT = 2
LEFT = -2
TOP = 2
BOTTOM = -2
NEAR = 2
FAR = 8
所以填写我们的值,我们得到一个投影矩阵:
现在我们将齐次 W 添加到我们的点上,即 (6, 0, -7),并得到 (6, 0, -7, 1)。
现在我们将矩阵与点相乘,得到 (6, 0, 6.29, 7)。 现在这个点(乘以投影矩阵后的点,应该位于“裁剪空间”中。假设在这个阶段进行了裁剪,确定一个点是在裁剪立方体的内部还是外部,并且应该在除法之前与 W。这是它在“剪辑空间”中的外观:
从我看到的消息来源来看,剪裁是在这个阶段完成的,如上所示,在除以 W 之前。如果现在除以 W,则该点最终位于剪裁空间立方体的右侧区域。这就是为什么我不明白为什么每个人都说透视分割是在剪切空间之后完成的。在这个空间中,在透视分割之前,该点完全位于外部,将被判断为在剪切空间之外,并且不可见。然而,在透视除法之后,除以 W,它的外观如下:
现在该点位于剪裁空间立方体内,可以判断在里面,并且是可见的。这就是为什么我认为透视分割是在剪裁之前完成的,因为如果剪裁空间在每个轴上处于 -1 到 +1 之间,并且剪裁阶段会检查这些尺寸,那么对于位于这个立方体内的点来说,它必须已经经历了分割W,否则几乎任何点都位于剪裁空间立方体之外并且永远不可见。
那么为什么大家都说首先是裁剪空间,这是投影矩阵的结果,然后才有透视除法(除以W)导致NDC?
【问题讨论】:
-
我从这个问题本身学到了很多东西。
标签: opengl matrix graphics 3d projection