您的位置:首页 > 运维架构

【OpenGL】03 - OpenGL 坐标变换中的各种矩阵

2014-12-07 23:33 330 查看
基本都是shader 中的矩阵,这里分别列出来,简单说明一下, 作为一个小小的总结。

后续随着学习的深入,应该会持续的在本文章中增加新内容(大概吧)。

一、gl_ModelViewMatrix

OpenGL中的坐标变换,简单来说是这样四个坐标系间的三次变换:

1、局部坐标系(所谓的“对象空间” Object Space,也称为模型空间Model Space),我们设置的glVertex,就是这个坐标系下的值。

2、世界坐标系(World Space)。通过 glTransfer、glRotate等,会将局部的点放置到世界中来。这个过程称之为 “模型变换” Model Transfer

3、视点坐标系(或者"眼睛空间" Eye Space)。通过 gluLoockAt,将世界上的物品,放置到以观察者为原点的镜头中来。这个过程称之为“视图变换”,Viewing Transfer

4、投影坐标系(或者“裁减空间” Clip Space)。通过glOrtho、glFrustum、gluPerspective等,将镜头中的物体,映射到照片上来。这个过程称之为"投影变换" Projection Transfer。

(具体的数学推导可见本人另一篇文章 /article/8178553.html ,需要注意的是,直到视点坐标系,都是 “没有” 所谓近大远小的透视效果的。)

这里想要说明的是,为什么会有这样一个矩阵?为什么要将View 和 Model 变换合并,却又不合并 Projection?

最直接的好处是:方便光照的计算。

这两步变换,都不会改变坐标的 w 值,且其第四行总是为[0, 0, 0, 1]。但是在投影变换中,如果是透视投影,要复杂的多得多。

因此,在这个阶段,法向量矩阵是比较容易获取的。所以OpenGL运算中,是在模型视图变换之后,进行光照计算的。

而由于光照在shader中的重要性,提供这样一个矩阵也是理所当然的。

二、gl_ProjectionMatrix

这个真心没什么好说的。

三、gl_ModelViewProjectionMatrix

gl_ProjectionMatrix * gl_ModelViewMatrix (矩阵乘法不满足交换律,注意左右)。 一般更经常使用 ftransfer()。

四、gl_NormalMatrix

“gl_ModelViewMatrix左上角的3*3子集的逆转置”。

可以参考
《GLSL学习 -- gl_NormalMatrix》,已经说明的非常清楚。这里只补充一点,即为什么只需要取左上角的 3*3 子集。

这就需要知道gl_ModelViewMatrix 中,左上角3*3以外的部分是做什么用的呢?其实只标明了 glTransfer 的效果。而 glTransfer 对于法向量显然是没有影响的。所以当然可以忽略这一部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: