C++ 矩阵存储器

C++ 矩阵存储器,c++,matrix,directx,hlsl,C++,Matrix,Directx,Hlsl,我最近收到了一份声明,其中说明了direct3d和hlsl的以下内容: 矩阵在内存中正常运行 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 通常,向量*矩阵(例如D3DXMatrixTransform)将执行以下操作: 当一个矩阵被赋予一个着色器时,它被转置并存储在3/4常量寄存器中 c0 = 11,21,31,41 c1 = 12,22,32,42 c2 = 13,23,33,43 c3 = 14,24,34,44 接下来,在着色器中执行m

我最近收到了一份声明,其中说明了direct3d和hlsl的以下内容:

矩阵在内存中正常运行

11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
通常,向量*矩阵(例如D3DXMatrixTransform)将执行以下操作:

当一个矩阵被赋予一个着色器时,它被转置并存储在3/4常量寄存器中

c0 = 11,21,31,41
c1 = 12,22,32,42
c2 = 13,23,33,43
c3 = 14,24,34,44
接下来,在着色器中执行
mul(vec,mat)
将执行以下操作:

v0=包含位置的输入寄存器
r0=温度寄存器

dp4 r0.x, v0, c0 // (r0.x = v0 dot c0)
dp4 r0.y, v0, c1
dp4 r0.z, v0, c2
dp4 r0.w, v0, c3
…与D3DXMatrixTransform相同

以上提出了两个问题:

<> >代码> MUL(VEC,MAT),根据Wrad将Mulk()考虑为行向量和行主矩阵之间的乘法。然而,常量寄存器似乎在存储列而不是行。这是否意味着当输入矩阵存储在常量寄存器中时,mul()有一个单独的执行方法?(例如,在着色器内部创建矩阵时,它不会存储在常量寄存器中)

  • mul(mat,vec)
    时会发生什么情况,假设此处的矩阵也保存在常量寄存器中(从外部传递到着色器)


  • 在编译着色器时,可以指定矩阵是行主矩阵还是列主矩阵。我猜这种行为取决于选项。+1很好,我不知道您可以设置行或列主选项。我同意它可能是依赖的,但它并没有真正回答我提出的任何问题。这就是为什么我把它作为一个评论发布;)
    dp4 r0.x, v0, c0 // (r0.x = v0 dot c0)
    dp4 r0.y, v0, c1
    dp4 r0.z, v0, c2
    dp4 r0.w, v0, c3