HLSL mul 和 D3DXMATRIX 顺序不匹配

HLSL mul and D3DXMATRIX order mismatch

我试图直接将着色器中的变换矩阵与向量相乘,而不进行不必要的传输。根据 HLSL 的 mul 文档:

mul(x, y) Multiplies x and y using matrix math. The inner dimension x-columns and y-rows must be equal.

x [in] The x input value. If x is a vector, it treated as a row vector.

y [in] The y input value. If y is a vector, it treated as a column vector.

我在C++代码中有:

const D3DXMATRIX viewProjection = view * projection;
...
const D3DXMATRIX modelViewProjection = model * viewProjection;

其中 modelViewProjection 是复制到常量缓冲区而不是转置的行主序矩阵。然而,为了在 HLSL 中工作,我需要将变换矩阵与位置向量相乘:

output.position = mul(transformation, position);

这与 mul 文档所说的相反。

谁能解释一下哪里不匹配?

deprecated D3DXMath library and the more modern DirectXMath使用行主矩阵顺序。 HLSL 语言默认使用列优先矩阵顺序,因为它的乘法效率稍微高一些。因此,大多数使用设置常量缓冲区常量都会转置矩阵数据。在几乎所有情况下,任何 'cost' 转置矩阵都完全被系统中的所有其他延迟隐藏。

您当然可以告诉 HLSL 使用行优先矩阵顺序,这意味着 HLSL mul 需要在每个顶点上执行额外的指令,这就是为什么通常值得在 CPU 每次更新一次。

MSDN