透视划分解释?
Perspective division explanation?
根据一些来源,NDC 与剪辑 space 的不同之处在于 NDC 只是剪辑 space 在除以 W 分量之后。图元在 clip space 中被裁剪,在 OpenGL 中沿 X、Y 和 Z 轴为 -1 到 1(编辑:这是错误的,请参阅答案)。换句话说,clip space 是一个立方体。裁剪是在这个立方体中完成的。如果它落在里面,它是可见的,如果它落在外面,它是不可见的。
让我们举个简单的例子,我们从上往下看视锥体,沿着负 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)。
现在这个点(乘以投影矩阵后的点,应该在"clip space"。假设裁剪是在这个阶段完成的,弄清楚一个点是在裁剪立方体内部还是外部,并且应该是BEFORE用 W 除法。下面是它在 "clip space":
中的样子
从我看到的来源来看,剪裁是在这个阶段完成的,如上所示,在除以 W 之前。如果现在除以 W,该点将位于剪辑的右侧区域 space立方体。这就是为什么我不明白为什么每个人都说透视分割是在裁剪之后完成的space。在这个 space 中,在透视分割之前,该点完全位于外部,将被判断为在裁剪 space 外部,并且不可见。然而在透视除法之后,除以W,它是这样的:
现在点在剪辑space立方体之内,可以判断在里面,可见。这就是为什么我认为透视除法是在剪裁之前完成的,因为如果剪裁 space 在每个轴上都在 -1 到 +1 之间,并且剪裁阶段会检查这些维度,那么一个点必须在这个立方体内部已经被 W 除法,否则几乎任何点都在裁剪 space 立方体之外并且永远不可见。
那么为什么大家都说首先是裁剪space这是投影矩阵的结果,然后只有透视除法(除以W)才会产生NDC?
在剪辑 space 中,剪辑不是针对单位立方体进行的。它是针对边长为 w 的立方体完成的。如果每个点的 x,y,z 坐标都小于它们的 w 坐标,则点在可见区域内。
在您的示例中,点 [6, 0, 6.29, 7]
可见,因为所有三个坐标 (x,y,z) 都小于 7。
请注意,对于可见区域内的点,这完全等同于测试 x/w < 1
。问题从远平面前面的点开始,因为它们可能会被均匀划分投影到可见区域,因为它们的 w 值为负。众所周知,在不等式中除以负数会切换运算符,这在硬件上是行不通的。
进一步阅读:
根据一些来源,NDC 与剪辑 space 的不同之处在于 NDC 只是剪辑 space 在除以 W 分量之后。图元在 clip space 中被裁剪,在 OpenGL 中沿 X、Y 和 Z 轴为 -1 到 1(编辑:这是错误的,请参阅答案)。换句话说,clip space 是一个立方体。裁剪是在这个立方体中完成的。如果它落在里面,它是可见的,如果它落在外面,它是不可见的。
让我们举个简单的例子,我们从上往下看视锥体,沿着负 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)。 现在这个点(乘以投影矩阵后的点,应该在"clip space"。假设裁剪是在这个阶段完成的,弄清楚一个点是在裁剪立方体内部还是外部,并且应该是BEFORE用 W 除法。下面是它在 "clip space":
中的样子从我看到的来源来看,剪裁是在这个阶段完成的,如上所示,在除以 W 之前。如果现在除以 W,该点将位于剪辑的右侧区域 space立方体。这就是为什么我不明白为什么每个人都说透视分割是在裁剪之后完成的space。在这个 space 中,在透视分割之前,该点完全位于外部,将被判断为在裁剪 space 外部,并且不可见。然而在透视除法之后,除以W,它是这样的:
现在点在剪辑space立方体之内,可以判断在里面,可见。这就是为什么我认为透视除法是在剪裁之前完成的,因为如果剪裁 space 在每个轴上都在 -1 到 +1 之间,并且剪裁阶段会检查这些维度,那么一个点必须在这个立方体内部已经被 W 除法,否则几乎任何点都在裁剪 space 立方体之外并且永远不可见。
那么为什么大家都说首先是裁剪space这是投影矩阵的结果,然后只有透视除法(除以W)才会产生NDC?
在剪辑 space 中,剪辑不是针对单位立方体进行的。它是针对边长为 w 的立方体完成的。如果每个点的 x,y,z 坐标都小于它们的 w 坐标,则点在可见区域内。
在您的示例中,点 [6, 0, 6.29, 7]
可见,因为所有三个坐标 (x,y,z) 都小于 7。
请注意,对于可见区域内的点,这完全等同于测试 x/w < 1
。问题从远平面前面的点开始,因为它们可能会被均匀划分投影到可见区域,因为它们的 w 值为负。众所周知,在不等式中除以负数会切换运算符,这在硬件上是行不通的。
进一步阅读: