一直没有找到很好的解释,或者解释复杂简短,还是自己动手测试一下,测试步骤如下:
1.输入glTranslatef(0.1,0.1,0.0);
得到的GL_MODELVIEW_MATRIX的值为:
说明变换矩阵变换的是12,13,14,15这几个变量,问题又产生了,12,13,14,15又是最后一行还是最后一列呢?
2.输入
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat mat[] = {//检验矩阵的存储形式,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
glMultMatrixf(mat);
GLfloat Test[16];
glGetFloatv(GL_MODELVIEW_MATRIX,Test);
得到如下结果图:
说明在内存当中还是按行存储的。要不然Test【3】== 0.0,
改动代码如下:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.1,0.1,0.0);
GLfloat mat[] = {//检验矩阵的存储形式,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
glMultMatrixf(mat);
GLfloat Test[16];
glGetFloatv(GL_MODELVIEW_MATRIX,Test);
这里就出问题了:
假如按前两部的内存进行相乘,我们可以计算得到的矩阵应该是:T * mat = C
1 0 0 0 1 0 0 1 1 0 0 1
0 1 0 0 * 0 1 0 0 = 0 1 0 0
0 0 1 0 0 0 1 0 0 0 1 0
0.1 0.1 0 1 0 0 0 1 0.1 0.1 0 1.1
我们发现差距如此之大??怎样才能得到内存中的结果呢?
研究发现,要使得,Test【0】=1.1,唯一的方法是 T的转置 * mat的转置 = Test的转置
所以最后内存中存的结果也是经过OpenGL内部转置而成的。
经过以上总结,OpenGL的列存储真是瞎鸡巴扯,搞死神仙,你载入的矩阵在内存还是按行存储的,它所谓的列存储是当你载入矩阵时,会在相乘的时候自动解析为按列扫描,这样两个矩阵相乘时就会变为 A的第一列 * B的第一行 = 第一个元素,A的第二列 * B的第第一行 =第二个元素(注意,我说的是内存当中的第一个第二个元素,一次类推)
为了避免过长让你灰心,先冷静一下,想明白一下,下一节讨论一下如何矩阵转换。