私は最近、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
次に、シェーダーで a を実行すると、次のmul(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 と同じです。
上記は2つの質問をもたらします:
mul(vec,mat)
、仕様によれば、この順序での mul() は、行ベクトルと行優先行列の間の乗算であると見なされます。それでも、定数レジスタは行ではなく列を格納しているようです。これは、入力行列が定数レジスタに格納されている場合と格納されていない場合に、mul() に別の実行方法があることを意味しますか? (例: 行列がシェーダー内で作成される場合、定数レジスターには格納されません)mul(mat, vec)
ここで行列が定数レジスタにも保存されていると仮定すると (外部からシェーダーに渡されます)、 の場合はどうなりますか?