为什么OpenGL中使用了多个可能的投影矩阵定义?

时间:2012-06-18 04:48:10

标签: math opengl glsl

我刚读过an article on www.songho.ca,表示投影矩阵由:

定义
[2n/(r-l) 0        (r+l)/(r-l)  0            ]
[0        2n/(t-b) (t+b)/(t-b)  0            ]
[0        0        -(f+n)/(f-n) -2*n*f/(f-n) ]
[0        0        -1           0            ]

其中:

n: near
f: far
l: left
r: right
t: top
b: bottom

我还阅读了www.geeks3d.com提供的替代定义:

[w 0 0  0]
[0 h 0  0]
[0 0 q -1]
[0 0 qn 0]

其中:

w=(2*near)/(width * aspect)
h = 2near/height
q=-(far+near)/(far-near)
qn=-2*(far*near) / (far-near)

为什么M[0][2]M[1][2]存在差异(不包括一个是其他的转置)?它们会产生相同的结果吗?在没有任何转置的情况下哪一个可用于GLSL?

1 个答案:

答案 0 :(得分:1)

第一个矩阵允许您任意定位左,右,顶部和底部剪裁平面位置。第二个总是给你一个居中的,对称的平截头体,这是一种限制。例如,当您进行立体渲染时,您需要稍微移动左右平面。

  BTW,哪一个可以在没有任何转置的GLSL中使用?

这与GLSL无关。你可以使用其中之一。您所指的转置源于矩阵在OpenGL内部表示的方式,并与外部世界接口。

无论如何,你不应该将矩阵硬编码到着色器源代码中,而是通过 Uniform 提供它们。

更新

OpenGL命令其矩阵列为major,即

0 4 8 c
1 5 9 d
2 6 a e
3 7 b f
相关问题