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
我试图直接将着色器中的变换矩阵与向量相乘,而不进行不必要的传输。根据 HLSL 的 mul
文档:
mul(x, y)
Multipliesx
andy
using matrix math. The inner dimension x-columns and y-rows must be equal.
x [in]
Thex
input value. Ifx
is a vector, it treated as a row vector.
y [in]
They
input value. Ify
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