【GLSL TIPS】行列の宣言と計算の注意点


GLSLではさほど使う機会のない行列ですが画像処理で使うこともあります。

この行列について根本的な部分の勘違いと、勘違いに気づかない原因について覚書きしておきます。間違いに気づけないのは本当に厄介。

ついでに行列について1からおさらい。

前回float比較について色々言ってますが結局==比較します。問題ないし楽だから。

行列の宣言

まずは定義とアクセスです。

確認用コード(グレーになることを確認)。

ここまでは特にいうことはないですね。

matrixは以下のようにvectorで定義することもできます。

行列の計算

ここでベクトルと掛け合わせてみましょう。

GLSLではベクトルの転置なんかは考えなくていいです。

となるので新しいベクトルは[1, 2]となりそうですが、そうはなりません。

 

逆の場合はこうなります。

これも[1, 3]になりそうなのに[1, 2]になっています。

行列定義

前見た資料を見直すとちゃんと書いてました。

The floats are assigned to elements in column major order. (OpenGL ES1.0)

To initialize a matrix by specifying vectors or scalars, the components are assigned to the matrix elements
in column-major order. (OpenGL ES3.0)

 

より分かりやすく書いてるのはここです。

 

つまり定義する上で行に見えるところはカラム(列)だったんですね。

分かりやすく考えると転置行列を定義している感じです。

実用例と勘違いの元

なんでこんな根本的なことに今まで気づかなかったかというと、あまり使わないのもありますが基本的に使うのが回転行列ぐらいだったからです。

 

回転行列は掛ける順序や転置、回転方向によって同じ結果になります。

さらに言えば、gl_FragColor=texture2D(t, r*uv);のような使い方では回転行列とは逆方向にテクスチャが回るように見えるため、勘違いしたままで正しく動くということになっていました。

 

色系のフィルタなどを使うとおかしいことに気づけます。

このように通常の行列として書いてしまった場合は計算順序を変える。

行列の性質おまけ

float 1つで定義した場合、スカラー行列になる。

 

matrix定義順にvectorに入れることが出来る。


コメントを残す

メールアドレスが公開されることはありません。