在规范和蓝皮书中使用列主格式

时间:2011-11-11 09:47:31

标签: opengl

我刚刚在这里阅读了一个OpenGL常见问题:http://www.opengl.org/resources/faq/technical/transformations.htm

看看他们标题为“9.005 OpenGL矩阵是专栏还是行专业?”的部分。最底层说:

“令人遗憾的是,在规范和蓝皮书中使用列主要格式导致了OpenGL编程社区中无休止的混淆。列主要符号表明矩阵不像程序员所期望的那样在内存中布局。”

现在,我一直在努力将矩阵数据按列主顺序传递给OpenGL,以免浪费OpenGL在转置操作上的处理时间。但这个FAQ的回答是否意味着我不需要这样做?

1 个答案:

答案 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]);

而不是首先必须从矩阵中逐步废弃这些矢量。