2011年7月28日木曜日

OpenGL ES2.0 シェーダの行列計算

Adreno 200・Tegra 250と、PowerVR SGX540で
行列計算の結果が異なる。
確認したのは4次元の場合。
mat4 m;
vec4 p;
p = p*m;

詳しく調査していないけれど、PowerVRで表示の奥行きが崩れているので、
列か行どちらか4番目の扱い方が違うっぽい。

列ベクトルで、変換は左から行列を掛けるように行列を作っていると、
mat4 m;
vec4 p;
p = p*m;
でよいはず。実際、Adreno 200・Tegra 250では問題ない。
(column majorだから逆から掛けている)
これだとPowerVRで崩れるので、シェーダに渡す前に行列を転置、
p = m*p;
とすると3つのGPUで上手くいく。なんだこれは。

ES2.0で、glUniformMatrix のtranspose引数はG_FALSEじゃないといけないの、
すぐに忘れるな。

0 件のコメント:

コメントを投稿