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

时间:2015-08-09 09:01:24

标签: opengl

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

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

  1. OpenGL中的投影变换实际上不是投影矩阵,而是将一个点转换为剪辑空间(仍然是R 3 域的一部分)并且实际投影到2D平面上后来作为管道的固定功能。
  2. 投影矩阵不适用透视分割;但是它确实需要设置w坐标,以便当透视分割稍后发生时(作为管道的固定功能),点被正确放置在NDC内部或外部。
  3. 剪辑空间是x,y轴上的(-1,+ 1)和z轴上的(n,f)之间的框,而NDC是所有轴上的(-1,+ 1)之间的框
  4. 我分析了以下投影矩阵得出上述结论:

    [ 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 个答案:

答案 0 :(得分:4)

  1. OpenGL中的投影矩阵将点转换为剪辑空间。但这已经是一个预测。矩阵乘法后唯一需要做的就是视角分割。

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

  3. 附加说明:

    • 数学上,OpenGL投影矩阵将4D空间(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]中,z在[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)

答案 1 :(得分:0)

我想这很大程度上取决于如何精确地定义“投影”。维基百科介绍mathematical projections如下:

  

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

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

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

我所听到的术语与上述严格的数学预测不同,这种术语是“透视变换”,从数学的角度来看,这可能更有意义。这些的好处在于它们是可逆的(在某种程度上/存在歧义,因为在镜像前面映射物体的透视划分,但是这些物体位于观察截头体之外并且通常不构成一个问题)。