【问题标题】:confuse with row major and column major matrix multiplication in hlsl与 hlsl 中的行主矩阵和列主矩阵乘法混淆
【发布时间】:2014-03-31 07:47:16
【问题描述】:

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

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

OutPosition = mul( InPosition, mViewProj ); 

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

OutPosition = mul( mViewProj, InPosition );

如果我改变 this 的顺序,它将无法正常工作。

我找到了一些文章,他们说 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

它看起来像 store as row major。为什么?

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

【问题讨论】:

    标签: shader hlsl matrix-multiplication vertex-shader dx


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2014-07-09
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多