2015-08-09 185 views
2

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

可有人请确认(或如果错误是正确的)是:

  1. 在OpenGL的投影变换是不实际的投影矩阵,而是把一个点到剪辑空间(这仍然是一部分将R 3 )和实际投影到二维平面上后发生,因为管道的固定功能。
  2. 投影矩阵不适用的透视分割;但是它确实需要设置w坐标,以便稍后发生透视分割(作为管线的固定功能),点正确放置在NDC的内部或外部。
  3. 剪辑空间上的X,Y轴之间的箱(-1,+ 1),和(n,f)关于z轴而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内核或更高版本)适用的答案只有请。

回答

3
  1. OpenGL中的投影矩阵将点转换成剪辑空间。但这已经是一个预测。在矩阵乘法之后唯一必须做的是视角分隔。

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

其他备注:

  • 在数学上,一个OpenGL投影矩阵映射四维空间(P^4)到另一个4D空间(剪切空间)。这可以通过矩阵的形式很容易地看出(4×4矩阵映射4D→4D)。通过透视分割,4D剪辑空间被均匀化截断为3D NDC(R^3)空间。
  • 点在投影后可见,当它的x,y,z坐标介于[-w,w]之间时。裁剪之所以发生在视角分割之前,是因为NDC不一定是立方体空间(它在OpenGL中是一个,但是在DirectX中,例如,NDC是x,y在[-1,1]中,y在[0, 1])
  • 几何投影一般定义为从一个空间(O)到另一个空间(T)的映射P.这将被写为

    O --p--> T

    在某些情况下可以通过在欧几里德空间中的改造的探讨矩阵(平行投影,例如,将工作)来描述这样的映射,但在很多情况下,这是不可能(尤其是在O中的平行线不再与T平行的情况下)。这就是为什么需要投影空间的原因。

我现在好多了停在这里,因为它变得越来越从数学的角度看更复杂,但如果你想挖掘更多的进入这个话题,我建议下面的文章:

Wikipedia Projective Space
Wikipedia Projective Geometry
Video about projection in general (this, and the next one)

0

我想这取决于如何定义exactrly“预测”了许多。维基百科介绍mathematical projections如下:

在数学中,投影是一组(或其它 数学结构)的成子集的映射(或子结构),这是 等于其用于映射组合物方(或换句话说,哪个是幂等的)。

换句话说,应用投影两次不会进一步改变结果。很容易看出,如果将3D点投射到嵌入该空间的任何2D平面,则此属性已满。

但是,用于渲染3D图形的典型“投影”矩阵不符合该条件。 “投影”这个术语有点松动。 我们实际上不希望将3D点投影到信息丢失的2D子空间。例如,我们希望将深度信息保留在屏幕空间中,以便能够进行深度测试。所以在概念上,即使在“视角鸿沟”之后,我们仍然拥有3D空间。并且GL的窗口空间被明确定义为3维,具有窗口空间z值。当然,只有x和y用于寻址颜色缓冲区中的像素,但是每个生成的片段都有它的z值。

我听到到不同此类操作的从如上所述是“透视变换”,这可能更有道理从数学的角度来看严格的数学突起的术语。这些好处在于它们是可逆的(在一定程度上/由于映射在镜像前面的镜头背后的物体的视觉差异而涉及模糊,但是这些位于视锥体之外并且通常不构成一个问题)。