【问题标题】:Perspective division explanation?透视划分解释?
【发布时间】: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


【解决方案1】:

在裁剪空间中,裁剪不是针对单位立方体进行的。它是针对边长为 w 的立方体完成的。如果每个点的 x,y,z 坐标都小于它们的 w 坐标,则这些点位于可见区域内。

在您的示例中,点 [6, 0, 6.29, 7] 是可见的,因为所有三个坐标 (x,y,z) 都小于 7。

注意,对于可见区域内的点,这完全等同于测试x/w < 1。问题从远平面前面的点开始,因为它们的 w 值为负,因此它们可能会被齐次分割投影到可见区域。众所周知,不等式中除以负数会切换运算符,这在硬件上是不可行的。

进一步阅读:
OpenGL sutherland-hodgman polygon clipping algorithm in homogeneous coordinates
Why clipping should be done in CCS, not NDCS
Why does GL divide gl_Position by W for you rather than letting you do it yourself?

【讨论】:

  • 非常感谢。所以剪裁不是针对 -1 到 +1 的立方体进行的,而是针对 -w 到 +w 的立方体进行的?嗯,这是完全有道理的。不过,我认为这是一种误导,因为剪辑空间在任何地方都被定义为 -1 到 +1 的立方体。
  • 通常情况下,NDC空间中的可见区域范围是-1到1。由于您没有在问题中提供任何链接,我无法检查这些问题。
  • 我确信我会继续看到它,尽管我很高兴现在我明白了。根据您可能熟悉的另一位用户derhass 的说法,这似乎是一个常见的误解:“大多数人将剪辑空间想象为立方体 [-1,1]^3。但是,这不是剪辑空间”跨度>
  • 看起来 OpenGL 中的惯例是让相机向下看负 Z 轴,这只是惯例还是必要的?我的意思是假设我将正确矩阵列和行中的 -1 更改为 1,然后我可以轻松地将所有对象转换为正 Z,让相机向下看正 Z。我在想结果如果正确完成,矩阵乘法的结果将相同。这对我来说更有意义,即让相机向下看正 Z。
  • @Zebrafish:这纯粹是惯例。在现代 GL 中,这种约定甚至不再存在。您只需要确保视图矩阵和投影矩阵符合约定即可。
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 2012-05-08
  • 2023-03-10
  • 2012-11-12
  • 2012-12-16
  • 2014-03-06
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多