我意识到在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 *矩阵。
答案 0 :(得分:0)
HLSL使用Column-Major,XNAMath使用ROW-Major。在将矩阵提供给HLSL着色器应该工作之前调换矩阵。两天前我也很困惑。