投影矩阵可以将高维空间中的向量投影到子空间上。我本以为OpenGL中的投影矩阵将R3中的点投影到二维平面上。这似乎得到了互联网上许多文献的支持。许多站点暗示投影矩阵将3D世界投影到平面上,并绘制出来。然而,我感觉这些解释大多数都省略了几个步骤。其中许多看起来相互矛盾,因此我希望对我自己分析的结论进行澄清。
请问是否可以确认以下(如果错误请更正):
1. OpenGL中的投影变换实际上不是投影矩阵,而是将一个点转换为剪裁空间(仍然属于R3域),实际的投影到二维平面发生在渲染管线之后作为固定函数。
2. 投影矩阵不执行透视除法;但它需要设置w坐标,以便当透视除法稍后发生时(作为管道的固定函数),点被正确地放置在NDC内部或外部。
3. 剪裁空间是在x、y轴上(-1,+1)之间,在z轴上是(n,f),而NDC则在所有轴上都是(-1,+1)之间的盒子。
我通过分析以下投影矩阵得出了以上结论:
请问是否可以确认以下(如果错误请更正):
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核心或更高版本)的特定答案。