2014-03-31 58 views
0

我意识到,在d3dx数学库或xnamath库,矩阵被保存在内存行主要。 在效果框架中,当我们通过效果接口setvarible设置矩阵参数时,它将转置目标矩阵。如果我没有使用效果框架,我必须设置由SetVertexConstantF着色器参数...混淆与行主要和列主要矩阵乘法在hlsl

但是当我使用效果框架,我必须在此代码转换顶点:在正常着色器代码

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

HLSL使用Column-Major,而XNAMath使用ROW-Major。在将其提供给HLSL Shader之前,应对其进行转置。两天前我也很困惑。