我试图将着色器中的变换矩阵与向量直接相乘而不进行不必要的传输。根据HLSL的mul
文档:
mul(x, y)
使用矩阵数学将x
和y
相乘。内部维度x列和y行必须相等。
x [in]
x
输入值。如果x
是向量,则将其视为一行 矢量。
y [in]
y
输入值。如果y
是向量,则将其视为列 矢量。
我有C ++代码:
const D3DXMATRIX viewProjection = view * projection;
...
const D3DXMATRIX modelViewProjection = model * viewProjection;
其中modelViewProjection
是行主要顺序矩阵,复制到常量缓冲区,而不是转置。但是,为了在HLSL中工作,我需要将变换矩阵与位置矢量相乘:
output.position = mul(transformation, position);
与mul
文档所说的相反。
有人可以解释这里不匹配的地方吗?
答案 0 :(得分:1)
deprecated D3DXMath库和更现代的DirectXMath使用行主矩阵顺序。 HLSL语言默认使用列主矩阵顺序,因为它对于乘法更有效。因此,大多数使用设置常量缓冲区常量将转置矩阵数据。几乎在所有情况下,任何成本都是'在这里转置矩阵完全被系统中所有其他延迟隐藏。
你当然可以告诉HLSL使用行主矩阵顺序,这意味着HLSL mul
需要对每个顶点做一个额外的指令,这就是为什么它通常值得进行转置的原因相反,每次更新CPU一次。
请参阅MSDN