HLSL 中矩阵的 column_major 与 row_major 属性

调用
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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值