1

我最近看到一篇文章,其中针对 direct3d 和 hlsl 说明了以下内容:

矩阵在内存中正常。

11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44

通常一个向量 * 矩阵(例如一个 D3DXMatrixTransform)会做:

outx = vec dot (11,21,31,41)
outy = vec dot (12,22,32,42)
outz = vec dot (13,23,33,43)
outw = vec dot (14,24,34,44)

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

c0 = 11,21,31,41
c1 = 12,22,32,42
c2 = 13,23,33,43
c3 = 14,24,34,44

接下来,在着色器中执行 amul(vec,mat)将执行以下操作:

v0 = input register containing position r0 = temp register

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 相同。

上面提出了两个问题:

  1. mul(vec,mat),根据规范将按此顺序将 mul() 视为行向量和行主矩阵之间的乘法。然而,常量寄存器似乎存储的是列而不是行。这是否意味着 mul() 有一个单独的执行方法,用于输入矩阵何时存储在常量寄存器中,何时不存储?(例如,当在着色器中创建矩阵时,它不会存储在常量寄存器中)

  2. mul(mat, vec)假设这里的矩阵也保存在常量寄存器中(从外部传递到着色器)会发生什么情况?

4

0 回答 0