清楚OpenGL代码中的列主矩阵和行主矩阵

关于列主矩阵行主矩阵,网上的解释比较多,但是越看越迷惑。问得比较好的可以看一下这个链接,我这边尽量把这个东西弄得明明白白。

举个例子,我们看到的translate无非就是如下两种形式:

                   (逻辑运算1)

或者

                  (逻辑运算2)

 

 

这里的计算跟列主矩阵和行主矩阵有关系吗?没有关系,不能说第一个是列主矩阵,第二个是行主矩阵,或者相反。可以看到一些例子translate矩阵都是第一个例子模样,但有的说系统使用行主矩阵,比如ogldev,有的说是用列主矩阵,比如songho

那么列主矩阵和行主矩阵到底是什么?区别在哪里?列主还是行主是从glUniformMatrix*()的角度来看data的数据排列方式。一般来说是从Matrix对象中抽取连续的16个float作为数据,因此排布的关键落在Matrix的实现上,这也就是为什么Matrix的源代码往往会告诉你它是列主还是行主。以ogldev和songho的Matrix为例,他们使用的如果是逻辑运算1中的矩阵:

  • 对于ogldev的矩阵,它的存储是行存储:float m[4][4],因此传输到glUniformMatrix*()时,内存的形式是:[1, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 1]。
  • 对于songho,他的存储是列存储:float m[16](这里构造函数按列填充它),内存的形式是:[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 3, 1]。

在接下来在glsl读取时,由于glsl它说它是列主矩阵,也就意味着要把这16个float以列向量依次排布形式看待。因此一次用4个float来构建列向量,形成矩阵。

如果是songho的存储排布,这时候合成的矩阵就跟逻辑矩阵一致。

如果是ogldev的存储排布,需要通过转置(GL_TRUE)使得合成的矩阵跟逻辑矩阵一致。

接下来再使用mat4*vec4进行相关计算。

posted on 2013-10-30 10:31  海边的贝壳  阅读(1726)  评论(0编辑  收藏  举报

导航