0

我意识到在 d3dx 数学库或 xnamath 库中,矩阵保存在内存中的主要行。在效果框架中,当我们通过效果接口setvariable设置一个矩阵参数时,它会转置目标矩阵。如果我不使用效果框架,我必须通过 SetVertexConstantF 设置着色器参数...

但是当我使用效果框架时,我必须通过以下代码转换顶点:

OutPosition = mul( InPosition, mViewProj ); 

在没有效果框架的普通着色器代码中,我必须使用:

OutPosition = mul( mViewProj, InPosition );

如果我更改此顺序,它将无法正常工作。

我找到了一些文章,他们说 hlsl 将矩阵存储为列专业。如果是真的,我想我必须使用预乘矩阵:

OutPosition = mul( mViewProj, InPosition );

但是当我在 pix 或 nsight 中调试它时,我发现 marix 参数存储在寄存器中,因为它在内存中,例如:如果 mViewProj 是:

x0 y0 z0 w0
x1 y1 z1 w1
x2 y2 z2 w2
x3 y3 z3 w3

在顶点着色器寄存器中:

c0:x0 y0 z0 w0
c1:x1 y1 z1 w1
c2:x2 y2 z2 w2
c3:x3 y3 z3 w3

它看起来像商店作为行专业。为什么?

这是否与矩阵乘法的基本规则冲突:列专业:矩阵* vec 行专业:vec * 矩阵。

4

1 回答 1

0

HLSL 使用 Column-Major,而 XNAMath 使用 ROW-Major。在将矩阵提供给 HLSL 着色器之前转置矩阵应该可以工作。前两天我也很困惑。

于 2014-11-18T15:38:55.817 回答