【发布时间】: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