我对矩阵定义感到完全困惑。我有一个矩阵类float[16]
,根据以下观察,该类持有一个我假设是行主要的:
float matrixA[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
float matrixB[4][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } };
matrixA
并且matrixB
两者在存储器中的相同的线性布局(即,所有数字是按顺序)。根据http://en.wikipedia.org/wiki/Row-major_order,这表示行为主的布局。
matrixA[0] == matrixB[0][0];
matrixA[3] == matrixB[0][3];
matrixA[4] == matrixB[1][0];
matrixA[7] == matrixB[1][3];
因此,matrixB[0]
=第0行,matrixB[1]
=第1行,依此类推。同样,这表示行占主导地位的布局。
当我创建如下所示的翻译矩阵时,我的问题/困惑就来了:
1, 0, 0, transX
0, 1, 0, transY
0, 0, 1, transZ
0, 0, 0, 1
在内存中的布局为{ 1, 0, 0, transX, 0, 1, 0, transY, 0, 0, 1, transZ, 0, 0, 0, 1 }
。
然后,当我调用glUniformMatrix4fv时,我需要将转置标志设置为GL_FALSE,表明它是列主要的,否则诸如transform / scale等的转换将无法正确应用:
如果转置为GL_FALSE,则假定每个矩阵以列主序提供。如果转置为GL_TRUE,则假定每个矩阵按行主要顺序提供。
为什么我的矩阵(主要是行主要的)需要作为列主要的传递给OpenGL?
GL_FALSE
?您如何使用制服?