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

5
投影矩阵可以将高维空间中的向量投影到子空间上。我本以为OpenGL中的投影矩阵将R3中的点投影到二维平面上。这似乎得到了互联网上许多文献的支持。许多站点暗示投影矩阵将3D世界投影到平面上,并绘制出来。然而,我感觉这些解释大多数都省略了几个步骤。其中许多看起来相互矛盾,因此我希望对我自己分析的结论进行澄清。
请问是否可以确认以下(如果错误请更正):
1. OpenGL中的投影变换实际上不是投影矩阵,而是将一个点转换为剪裁空间(仍然属于R3域),实际的投影到二维平面发生在渲染管线之后作为固定函数。
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     ]

通过分析,我得出结论:所有在视锥体内的点在x、y轴上都将在剪切边界内;然而,在z轴上可能会超出边界。一旦透视除法发生(此时w成为旧的-z),该点将完全位于剪裁空间中。

由此我还得出结论:经MVP变换后,为了使一个点可见,它的x、y和z/w坐标必须介于+/-1之间,并且透视除法和实际投影发生在顶点着色器之后。

如果可能,请仅限于现代OpenGL(3.3核心或更高版本)的特定答案。

2个回答

4
  1. OpenGL中的投影矩阵将点转换为裁剪空间。但这已经是一个投影了。在矩阵乘法之后唯一需要做的就是透视除法。
  2. 正确
  3. 裁剪空间是每个轴上从[-w到w]的空间,因为在裁剪空间和NDC之间发生的唯一操作就是透视除法。NDC是每个轴上从[-1到1]的空间。

附加说明:

  • 从数学上讲,OpenGL投影矩阵将4D空间(P^4)映射到另一个4D空间(裁剪空间)。通过透视划分,4D裁剪空间通过齐次化被截断为3D NDC(R^3)空间。
  • 当点的x、y、z坐标在[-w,w]之间时,在投影后该点是可见的。剪裁发生在透视除法之前的原因是,NDC不一定是立方体空间(在OpenGL中是一个,但是在DirectX中,例如,NDC是x、y在[-1,1],z在[0,1])
  • 通常情况下,几何投影被定义为将一个空间(O)映射到另一个空间(T)的映射p。这将被写成
  • O --p--> T

    在某些情况下,这样的映射可以由欧几里得空间中的转换矩阵描述(例如平行投影),但在许多情况下,这是不可能的(特别是在O中的平行线在T中不再平行的情况下)。这就是为什么需要投影空间。

从数学角度来看,我最好停止在这里了,但如果您想深入了解这个主题,我建议阅读以下文章:

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


0

我猜这在很大程度上取决于如何准确地定义“投影”。维基百科介绍数学投影如下:

在数学中,投影是将一个集合(或其他数学结构)映射到一个子集(或子结构)的映射,该子集等于其映射组合的平方(或者换句话说,是幂等的)。

因此,换言之,应用两次投影不会进一步改变结果。很容易看出,如果将三维点投影到嵌入该空间的任何二维平面上,则满足此属性。

然而,用于3D图形渲染的典型“投影”矩阵并不符合那个标准。 “投影”这个术语使用得更加宽泛。 实际上,我们不想将3D点投影到2D子空间中,因为信息会丢失。我们想要在屏幕空间中保留深度信息,例如,能够进行深度测试。因此,在“透视除法”之后,从概念上讲,我们仍然有一个3D空间。而GL的窗口空间明确定义为三维空间,具有窗口空间z值。当然,只使用x和y来寻址颜色缓冲区中的像素,但是每个生成的片段都有它的z值。
我听说过用于区分此类操作与上述严格的数学投影的术语是“透视变换”,这从数学角度可能更有意义。这些东西的好处是它们是可逆的(在一定程度上存在模棱两可/由于透视除法,对象被映射到相机后面的镜像位置,但这些位于视景体之外,通常不会成为问题)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接