调用
XMMatrixTranslation(2.0f, 3.0f, 4.0f)
生成的矩阵为:
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
2.0, 3.0, 4.0, 1.0,
其在内存中的表示为连续的 16 个元素,记录顺序为行从上到下,行内元素从左到右( row_major 排列方式 )。
变换向量时,向量左乘该矩阵:
向量的 x 分量,乘上矩阵的第 0 , 4, 8, 12 个元素,并相加得到新的向量的 x 分量,为: x+2 ;
向量的 y 分量,乘上矩阵的第 1 , 5, 9, 13 个元素,并相加得到新的向量的 y 分量,为: y+3 ;
向量的 z 分量,乘上矩阵的第 2 , 6, 10, 14 个元素,并相加得到新的向量的 z 分量,为: z+4 。
计算新向量的各个分量时,分别要乘以矩阵中的不连续元素,这样无法充分利用硬件的向量乘法指令。
于是有了 column_major 排列的矩阵( HLSL 中默认的矩阵排列为 column_major )。
矩阵的 16 元素,记录顺序为列从左到右,列内元素从上到下。
这样做向量变换时,向量左乘该矩阵:
向量的 x 分量,乘上矩阵的第 0 , 1, 2, 3 个元素,并相加得到新的向量的 x 分量,为: x+2 ;
向量的 y 分量,乘上矩阵的第 4 , 5, 6, 7 个元素,并相加得到新的向量的 y 分量,为: y+3 ;
向量的 z 分量,乘上矩阵的第 8 , 9, 10, 11 个元素,并相加得到新的向量的 z 分量,为: z+4 。
计算新向量的各个分量时,分别乘以矩阵中的连续元素,这样可以充分利用硬件的向量乘法指令,提高效率。
因此,在将矩阵传送到 Shader 中前,先调用 XMMatrixTranspose 将 row_major 排列的矩阵,转换为 column_major 的矩阵。
这样,与 HLSL 中的矩阵的默认排列方式相同。
参考
XMMatrixTranslation method
https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.matrix.xmmatrixtranslation(v=vs.85).aspx
mul
https://msdn.microsoft.com/en-us/library/windows/desktop/bb509628(v=vs.85).aspx
Variable Syntax (column_major, row_major)
https://msdn.microsoft.com/en-us/library/windows/desktop/bb509706(v=vs.85).aspx