与hlsl中的行主要和列主要矩阵乘法混淆

时间:2014-03-31 07:47:17

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

我意识到在d3dx数学库或xnamath库中,矩阵在内存中保存了行主要部分。 在效果框架中,当我们通过效果接口setvarible设置矩阵参数时,它将转置目标矩阵。如果我不使用效果框架,我必须通过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 *矩阵。

1 个答案:

答案 0 :(得分:0)

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