我刚刚在这里阅读OpenGL FAQ:http://www.opengl.org/resources/faq/technical/transformations.htm
看看他们标题为"9.005是OpenGL矩阵列主要还是行主要?"的部分.它的底部说:
"遗憾的是,在规范和蓝皮书中使用列主格式导致了OpenGL编程社区中无休止的混淆.专栏主要表示矩阵不像程序员所期望的那样在内存中布局."
现在,我一直在不遗余力地将矩阵数据按列主顺序传递给OpenGL,以免浪费OpenGL在转置操作上的处理时间.但这个FAQ的答案是否意味着我不需要这样做?
常见问题解答本身有点过时了.从技术上讲,使用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
Run Code Online (Sandbox Code Playgroud)
X,Y和Z是您要转换的坐标系的基矢量,T是偏移量.
现在看看OpenGL使用的索引
0 4 8 c
1 5 9 d
2 6 a e
3 7 b f
Run Code Online (Sandbox Code Playgroud)
因此,在偏移0处,您找到X向量,在偏移4处找到Y,偏移量8给出Z,偏移量c给出T.您可以直接访问它们,将它们传递给向量操作函数,如
float vec4_length3(float v[4]);
Run Code Online (Sandbox Code Playgroud)
以直接的方式:
float M[16] = {...};
float T_length = vec4_length3(&M[c]);
Run Code Online (Sandbox Code Playgroud)
而不是首先必须逐个从矩阵中废弃这些矢量.