【问题标题】:Is the projection matrix in OpenGL really a "projection matrix"?OpenGL中的投影矩阵真的是“投影矩阵”吗?
【发布时间】:2015-11-01 08:45:35
【问题描述】:

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

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

  1. OpenGL 中的投影变换实际上不是投影矩阵,而是将一个点变换到剪辑空间(仍然是 R3 域的一部分),然后实际投影到 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     ]

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

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

请仅针对现代 OpenGL(3.3 核心或更高版本)提供适用的答案。

【问题讨论】:

    标签: opengl


    【解决方案1】:
    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])
    • 几何投影通常定义为从一个空间 (O) 到另一个空间 (T) 的映射 p。这将被写为

      O --p--> T

      在某些情况下,这样的映射可以用欧几里得空间中的变换矩阵来描述(例如,平行投影会起作用),但在很多情况下这是不可能的(尤其是在 O 中的平行线的情况下)在 T 中不再平行)。这就是为什么需要射影空间的原因。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      我听说过将此类操作与上述严格的数学投影区分开来的术语是“透视变换”,从数学的角度来看,这可能更有意义。这些的好处是它们是可逆的(在一定程度上/由于透视鸿沟将相机后面的物体映射到它前面,但它们位于视锥体之外并且通常不构成一个问题)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        相关资源
        最近更新 更多