opengl - 透视划分解释?

标签 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),并得到 (6, 0, -7, 1)。

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

enter image description here

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

enter image description here

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

那么为什么每个人都说首先是由投影矩阵产生的裁剪空间,然后才出现导致 NDC 的透视划分(除以 W)?

最佳答案

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

关于opengl - 透视划分解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46811240/

相关文章:

r - 使用 R apply 索引矩阵中 1 的位置

java - super.paintComponent(g) 的问题

c++ - glGenVertexArrays(1, &vao) 处的段错误;

c++ - HUD 已绘制,但 OpenGL 3D 场景消失

c++ - 将 cv::Mat 写入二进制文件?

c# - System.Drawing 对于 2D 游戏编程来说足够快吗?

python - Pygame 图像碰撞在视觉上留下图像之间的间隙

opengl - glsl 插值限定符去哪里?

c++ - SDL2 + OpenGL + SDL2_TTF : Displaying text

c - 邻接矩阵查找邻居