透视师解释?

时间:2017-10-18 13:22:37

标签: opengl matrix graphics 3d projection

根据数量来源,NDC与剪辑空间的不同之处在于,NDC只是在被W分割后划分的剪辑空间。基本体被剪切在剪辑空间中,在OpenGL中沿X,Y和Z轴是-1到1(编辑:这是错误的,请参阅答案)。换句话说,剪辑空间是一个立方体。剪切在此立方体内完成。如果它落在里面,它是可见的,如果它落在外面,它是不可见的。

所以让我们举一个这个简单的例子,我们从俯视图中俯视观察平截头体,沿负Y轴向下看。 HALFFOV是45度,这意味着NEAR和RIGHT都是相同的(在这种情况下长度为2)。示例点是(6,0,-7)。

enter image description here

现在,这是透视投影矩阵:

enter image description here

为简单起见,我们将使用1:1的宽高比。所以:

RIGHT = 2
LEFT = -2
TOP = 2
BOTTOM = -2
NEAR = 2
FAR = 8

因此填写我们的值,我们得到一个投影矩阵:

enter image description here

现在我们将同质W添加到我们的点,即(6,0,-7),得到get(6,0,-7,1)。

现在我们将矩阵与我们的点相乘,得到(6,0,6.29,7)。 现在这一点(与投影矩阵相乘后的点,应该位于“剪辑空间”。据说剪裁是在这个阶段完成的,弄清楚一个点是位于裁剪立方体的内部还是外部,并且据说是在分割之前与W.这是它在“剪辑空间”中的样子:

enter image description here

从我看到的来源我看到裁剪是在这个阶段完成的,如上所示,在除以W之前。如果你除以W现在,该点最终在剪辑空间立方体的右侧区域。这就是为什么我不明白为什么每个人都说透视划分在裁剪空间之后完成的原因。在这个空间中,在透视分割之前,该点完全位于外部并且将被判断为在剪切空间之外,并且不可见。然而,在透视划分后,除以W,这是它的外观:

enter image description here

现在该点位于剪辑空间立方体内,可以判断为内部和可见。这就是为什么我认为透视分割是在剪切之前完成的,因为如果裁剪空间在每个轴的-1到+1中,并且裁剪阶段检查这些尺寸,对于一个点在这个立方体内部,它必须已经经过分割通过W,否则几乎任何一点都位于裁剪空间立方体之外并且永远不可见。

那么为什么每个人都说首先是剪辑空间,这是投影矩阵的结果,而且只有透视划分(除以W)导致NDC?

1 个答案:

答案 0 :(得分:8)

在剪辑空间中,不会对单位立方体进行剪裁。它是在一个边长为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?