我刚读过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?
答案 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