OpenGL中的投影矩阵真的是“投影矩阵”吗?

Fra*_*cis 5 opengl

投影矩阵将向量从高维空间投影到子空间。我本来希望 OpenGL 中的投影矩阵将 R 3 中的一个点投影到二维平面上。这似乎得到了互联网上很多文献的支持。许多站点暗示投影矩阵将 3D 世界投影到平面上,这就是绘制的内容。然而,我觉得这些解释中的大多数都跳过了几个步骤。他们中的许多人似乎相互矛盾,所以我想澄清一下我从自己的分析中得出的结论。

有人可以确认(或纠正错误):

  1. OpenGL 中的投影变换实际上不是一个投影矩阵,而是将一个点变换到裁剪空间(它仍然是 R 3域的一部分),并且实际投影到 2D 平面上是稍后作为管道的固定函数发生的。
  2. 投影矩阵不应用透视划分;然而,它确实需要设置 w 坐标,以便在稍后发生透视分割时(作为管道的固定功能)点正确放置在 NDC 的内部或外部。
  3. 裁剪空间是 x,y 轴上 (-1,+1) 和 z 轴上 (n,f) 之间的框,而 NDC 是所有轴上 (-1,+1) 之间的框。

我分析了以下投影矩阵,得出上述结论:

[ 2n/(r-l)     0     (r+l)/(r-b)      0     ]
[    0     2n/(t-b)  (t+b)/(t-b)      0     ]
[    0         0    -(f+n)/(f-n) -2fn/(f-n) ]
[    0         0         -1           0     ]
Run Code Online (Sandbox Code Playgroud)

根据该分析,我得出结论,截锥体内的任何点都将位于沿 x,y 轴的剪辑边界内;它可能在沿 z 轴的边界之外,但是一旦发生透视分割(w 现在是旧的 -z),该点将完全在剪辑空间内。

由此我还得出结论,对于在 MVP 变换之后可见的点,它的 x、y 和 z/w 坐标必须在 +/-1 之间,并且透视分割和实际投影发生在顶点着色器之后。

如果适用的答案仅适用于现代 OpenGL(3.3 核心或更高版本)。

BDL*_*BDL 4

  1. OpenGL 中的投影矩阵将点变换到裁剪空间。但这已经是一个预测了。矩阵乘法之后唯一要做的就是透视除法。

  2. 真的

  3. 剪辑空间是每个轴上从 [-w 到 w] 的空间,因为剪辑空间和 NDC 之间发生的唯一操作是透视划分。每个轴上的 NDC 范围为 [-1 到 1]。

补充笔记:

  • 从数学上讲,OpenGL 投影矩阵将 4D 空间 (P^4) 映射到另一个 4D 空间(剪辑空间)。这可以通过矩阵的形式轻松看出(4x4 矩阵映射 4D -> 4D)。通过透视划分,4D 剪辑空间被同质化截断为 3D NDC (R^3) 空间。
  • 当 x、y、z 坐标位于 [-w, w] 之间时,点在投影后可见。剪裁发生在透视分割之前的原因是,NDC不一定是立方空间(在OpenGL中是立方空间,但在DirectX中,例如,NDC是[-1,1]中的x,y,[0,1]中的z) 1])
  • 几何投影通常被定义为从一个空间 (O) 到另一个空间 (T) 的映射 p。这将写成

    O --p--> T

    在某些情况下,这样的映射可以通过欧几里得空间中的变换矩阵来描述(例如,平行投影就可以),但在很多情况下这是不可能的(特别是在 O 中的平行线不平行的情况下) T 中还有更多)。这就是需要射影空间的原因。

我现在最好停在这里,因为从数学的角度来看它变得越来越复杂,但如果您想深入研究这个主题,我建议您阅读以下文章:

维基百科射影空间
维基百科射影几何
关于一般投影的视频(这个和下一个)