opengl投影-映射到NDC

到 NDC 的映射在哪里?

根据我的理解,投影矩阵做了两件事:首先,它裁剪视图空间以形成截锥体。它只保留落入截锥体中的顶点,但剪掉落入截锥体之外的其他顶点。其次,它将裁剪空间内的坐标映射到 NDC [-1, 1]。

但是我只看到我们通过使用 glm::perspective 或 glm::ortho 定义透视矩阵来创建一个截锥体(用于裁剪)。frustum和NDC之间的映射步骤在哪里?

或者我们只需要定义视锥体,OpenGL会自动为我们做这两个步骤?

回答

根据我的理解,投影矩阵做了两件事:首先,它裁剪了视图空间以形成截锥体。它只保留落入截锥体中但被剪掉的其他顶点落在外面的顶点。其次,它将裁剪空间内的坐标映射到 NDC [-1, 1]。

它不做这些事情。

4x4 矩阵只是一种变换。变换本身不能剪辑任何东西。虽然矩阵可以将坐标转换为 [-1, 1] 空间,但这不一定是顶点着色器提供的剪辑空间。而且它肯定不是 3D 投影矩阵使用的剪辑空间。

顶点着色器(或最后一个顶点处理着色器阶段)的唯一任务是为每个顶点生成一个剪辑空间位置。剪辑空间由 OpenGL 定义为 4D 空间,其中位置的 XYZ 分量在 [-W, W] 范围内被视为“可见”。这里,“W”是位置的 W 分量。因此,对于每个 XYZW,“可见”被定义为 XYZ 分量在 W 范围内的位置。

图元的实际裁剪发生在顶点着色器之后。每个图元的顶点都根据先前定义的 4D 裁剪空间进行裁剪。

投影平截头体是通过将位置转换为剪辑空间来创建的,这样平截头体外部的那些 4D 位置在 [-W, W] 范围之外,而平截头体内部的那些位置在该范围内。

所以这不是转换剪辑任何东西;它只是设置数据,以便 OpenGL 的剪辑系统将正确剪辑。

同样,剪辑空间不是 NDC 空间(除非位置的 W 分量为 1)。NDC 空间是通过获取剪辑空间位置的 XYZ 并将其除以该位置的 W 分量来定义的(如果 W 为 1,则这显然不会改变任何内容)。剪辑和 NDC 空间是两个独立的空间,剪辑发生NDC 空间之前。从概念上讲,您可以将裁剪视为针对 NDC 空间的 [-1, 1] 范围进行的。毕竟,剪辑空间在 [-W, W] 范围内,所以如果将其除以 W,就会得到范围 [-1, 1]。

但是记住剪辑空间不是 NDC 空间仍然很重要。


以上是opengl投影-映射到NDC的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>