投影矩阵将矢量从较高维空间投影到子空间。我原本期望OpenGL中的投影矩阵将R 3 中的一个点投影到二维平面上。这似乎得到了互联网上许多文献的支持。许多网站暗示投影矩阵将3D世界投影到一个平面上,这就是绘制的内容。但是我觉得大多数这些解释都跳过了几个步骤。他们中的许多人似乎互相矛盾,所以我想澄清一下我从自己的分析中得出的结论。
有人可以确认(或更正错误):
我分析了以下投影矩阵得出上述结论:
[ 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核心或更高版本)的特定答案。
答案 0 :(得分:4)
OpenGL中的投影矩阵将点转换为剪辑空间。但这已经是一个预测。矩阵乘法后唯一需要做的就是视角分割。
真
剪辑空间是每个轴上从[-w到w]的空间,因为剪辑空间和NDC之间发生的唯一操作是透视分割。 NDC在每个轴上都是[-1到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值。
我所听到的术语与上述严格的数学预测不同,这种术语是“透视变换”,从数学的角度来看,这可能更有意义。这些的好处在于它们是可逆的(在某种程度上/存在歧义,因为在镜像前面映射物体的透视划分,但是这些物体位于观察截头体之外并且通常不构成一个问题)。