【发布时间】:2015-11-01 08:45:35
【问题描述】:
投影矩阵将向量从高维空间投影到子空间。我本来希望 OpenGL 中的投影矩阵将 R3 中的一个点投影到二维平面上。这似乎得到了互联网上大量文献的支持。许多网站暗示投影矩阵将 3D 世界投影到平面上,这就是绘制的内容。但是我觉得这些解释中的大多数都跳过了几个步骤。其中许多似乎相互矛盾,所以我想澄清一下我从自己的分析中得出的结论。
有人可以确认(或纠正错误):
- OpenGL 中的投影变换实际上不是投影矩阵,而是将一个点变换到剪辑空间(仍然是 R3 域的一部分),然后实际投影到 2D 平面上稍后作为管道的固定功能。
- 投影矩阵不应用透视分割;但是它确实需要设置 w 坐标,以便稍后发生透视分割时(作为管道的固定函数)点正确放置在 NDC 内部或外部。
- 剪辑空间是 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