到NDC的映射在哪里?
根据我的理解,投影矩阵做两件事:首先,它裁剪视图空间以形成圆锥体。它只保留落入锥体的顶点,但会剪裁掉落入锥体之外的其他顶点。其次,它将裁剪后的空间中的坐标映射到NDC - 1,1。
但我只看到我们通过使用glm::透视或glm::ortho定义透视矩阵来创建一个平截体(用于裁剪)。在截锥和NDC之间进行映射的步骤在哪里?
或者我们只需要定义平截体,OpenGL会自动为我们完成这两个步骤?
发布于 2021-07-12 09:18:36
根据我的理解,投影矩阵做两件事:首先,它裁剪视图空间以形成圆锥体。它只保留落入锥体的顶点,而其他顶点则落在外面。其次,它将裁剪后的空间中的坐标映射到NDC - 1,1。
它不会做这两件事。
一个4x4矩阵只是一个变换。转换本身不能裁剪任何东西。虽然矩阵可以将坐标转换为-1,1空间,但这不一定是顶点着色器提供的剪辑空间。这肯定不是3D投影矩阵所使用的剪辑空间。
顶点着色器(或最后一个vertex processing shader stage)的唯一强制作业是生成clip-space position for each vertex。剪辑空间由OpenGL定义为位置的XYZ分量在-W范围内的4D空间,W被认为是“可见的”。这里,"W“是位置的W分量。因此,对于每个XYZW,“可见”被定义为XYZ分量在W范围内的位置。
基本体的实际裁剪发生在顶点着色器之后。根据先前定义的4D剪辑空间剪裁每个基本体的顶点。
投影锥体是通过将位置变换到剪辑空间来创建的,使得锥体外部的那些4D位置在-W,W范围之外,而在该范围内的那些4D位置在该范围内。
因此,转换并不是裁剪任何东西;它只是设置数据,以便OpenGL的裁剪系统能够正确裁剪对象。
同样,剪辑空间不是NDC空间(除非该位置的W分量为1)。NDC空间的定义是将剪辑空间位置的XYZ除以该位置的W分量(如果W为1,则这显然不会改变任何内容)。裁剪和NDC空间是两个独立的空间,裁剪发生在NDC空间之前。在概念上,您可以认为裁剪是针对-1,1范围的NDC空间进行的。毕竟,剪辑空间在-W,W的范围内,所以如果你除以W,你得到的范围是- 1,1。
但重要的是要记住,剪辑空间不是NDC空间。
https://stackoverflow.com/questions/68340918
复制相似问题