D3D与OpenGL矩阵,行主序与列主序

D3D中使用行主序矩阵,OpenGL中使用列主序矩阵。两者是反过来的。之前一直纳闷为何跨平台的程序中矩阵不需要进行转置操作,今天终于想明白了。

在两种API中,矩阵的内存存储顺序是相同的,只是解释不同。

假设有二维数组 a 表示矩阵, D3D中第 i 行第 j 列的值存储在 a[i][j] 中,GL则存储在 a[j][i] 中,由此抵消了转置。GL中两个矩阵相乘,P = MN,P[i][j] = Mj列 * Ni行。

对点P平移变换矩阵的内存表示为
M =
[1,0,0,0,
0,1,0,0,
0,0,1,0,
a,b,c,1]

D3D中P为行向量,放在前面  P’x = dot( P , Vec4(M[0], M[4], M[8], M[12]) )
GL中P为列向量 ,放在后面  P’x = dot( Vec4( M[0], M[4], M[8], M[12]), P )
结果是相同的。