MENU閉じる

LAB

プログラムTIPS最適化Tips

研究室プログラムTIPS2008.4.4

行列の「行優先」と「列優先」について

行列宣言には列優先(row-major)と行優先(column-major)があります。
等幅フォントじゃないとずれますが、行優先は

1  2  3  4<br />
5  6  7  8<br />
9 10 11 12<br />
13 14 15 16<br />

と横方向に定義されます。

列優先は

<strong>&darr;</strong> 1  5  9 13<br />
<strong>&darr;</strong> 2  6 10 14<br />
<strong>&darr;</strong> 3  7 11 15<br />
<strong>&darr;</strong> 4  8 12 16<br />

と縦方向に定義されます。
単に定義順の違いによるものですが、
これらをベクトルに対して乗算する場合に
大きな違いが出てきます。

ここで、試しにそれぞれの行列を
GPUのプログラマブルシェーダーで出力してみましょう。

【行優先の場合】

float4	pos;
float3	tpos = mul(pos, matrix);

というようなコードです。コンパイル結果を逆アセンブル表示してみると、、、

mul r0.xyz, v0.x, c0[a0.x]

mad r0.xyz, v0.y, c1[a0.x], r0

mad r0.xyz, v0.z, c2[a0.x], r0

mad r0.xyz, v0.w, c3[a0.x], r0

【列優先の場合】

dp4 o0.x, v0, c0

dp4 o0.y, v0, c1

dp4 o0.z, v0, c2

dp4 o0.w, v0, c3

列優先のほうが内積を用いた効率の良い演算になっています。
又、列優先にすることで直行座標の回転と平行移動量を
float4を3本使用した4×3行列に収めることもできます。
4×4よりも省メモリです。なにかとメリットのある列優先行列。
最適化には欠かせない存在でしょう。

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE