gpt4 book ai didi

c++ - opengl 投影-映射到 NDC 在哪里

转载 作者:行者123 更新时间:2023-12-02 16:09:41 25 4
gpt4 key购买 nike

到 NDC 的映射在哪里?

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

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

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

最佳答案

According to my understanding, the projection matrix do two things: first, it clipped the view space to form the frustum. It only keeps the vertice that's fall into the frustum but clipped others fall outside. Second, it maps the coordinates within the clipped space to NDC [-1, 1].

这两者都不做。

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

顶点着色器(或最后一个 vertex processing shader stage )唯一的强制性工作是生成一个 clip-space position for each vertex .剪辑空间由 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] 范围进行的。毕竟,clip-space 位于 [-W, W] 范围内,因此如果将其除以 W,您将得到范围 [-1, 1]。

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

关于c++ - opengl 投影-映射到 NDC 在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68340918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com