我意识到在 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 * 矩阵。