我刚刚在这里阅读了一个OpenGL常见问题:http://www.opengl.org/resources/faq/technical/transformations.htm
看看他们标题为“9.005 OpenGL矩阵是专栏还是行专业?”的部分。最底层说:
“令人遗憾的是,在规范和蓝皮书中使用列主要格式导致了OpenGL编程社区中无休止的混淆。列主要符号表明矩阵不像程序员所期望的那样在内存中布局。”现在,我一直在努力将矩阵数据按列主顺序传递给OpenGL,以免浪费OpenGL在转置操作上的处理时间。但这个FAQ的回答是否意味着我不需要这样做?
答案 0 :(得分:8)
常见问题解答本身有点过时了。从技术上讲,使用OpenGL-3,可以通过将 glUniformMatrix 的转置参数设置为true来以行顺序格式传递矩阵。
然而,我个人发现列主要有一个很大的好处:它允许一个人直接访问矩阵描述的坐标系(变换)的基矢量。看看你的典型转换矩阵
X_x Y_x Z_x T_x
X_y Y_y Z_y T_y
X_z Y_z Z_z T_z
W_a W_b W_c W_w
X,Y和Z是您要转换的坐标系的基矢量,T是偏移量。
现在看看OpenGL使用的索引
0 4 8 c
1 5 9 d
2 6 a e
3 7 b f
因此,在偏移0处,您找到X向量,在偏移4处找到Y,偏移量8给出Z,偏移量c给出T.您可以直接访问它们,将它们传递给矢量操作函数,如
float vec4_length3(float v[4]);
以直接的方式:
float M[16] = {...};
float T_length = vec4_length3(&M[c]);
而不是首先必须从矩阵中逐步废弃这些矢量。