プログラムTIPS

DEMO PROGRAM ヘキサドライブでは様々な研究開発をしています。その一部を紹介。

行列の「行優先」と「列優先」について(2008年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よりも省メモリです。なにかとメリットのある列優先行列。
最適化には欠かせない存在でしょう。

【免責事項】

本サイトが提供している情報に関しては、安全性等、いかなる保証もされません。 株式会社ヘキサドライブは、これらの情報をあなたが利用することによって生ずるいかなる損害に対しても一切責任を負いません。

【著作権】

本サイトが提供しているコンテンツについては、特に断りのある場合を除き、株式会社ヘキサドライブが著作権を有します。