私は最近、OpenGL ES 1.1/2.0 2D パイプラインをゼロからまとめ始めました (iPhone のみ)。このパイプラインは、3D 数学の経験がないエンジニアが使用することを目的としています。
コメント アウトされているのは、正確な結果を生成する X 軸と Y 軸の回転マトリックスです。Z 回転行列は何もしないようです。
頂点シェーダー
//THESE WORK
/*
highp mat4 rotationMatrix = mat4(1.0, 0.0, 0.0, 0.0,
0.0, cos(angle), -sin(angle), 0.0,
0.0, sin(angle), cos(angle), 0.0,
0.0, 0.0, 0.0, 1.0);
highp mat4 rotationMatrix = mat4(cos(angle), 0.0, sin(angle), 0.0,
0.0, 1.0, 0.0, 0.0,
-sin(angle), 0.0, cos(angle), 0.0,
0.0, 0.0, 0.0, 1.0);
*/
//THIS DOESN'T WORK >:(
highp mat4 rotationMatrix = mat4(cos(angle), -sin(angle), 0.0, 0.0,
sin(angle), cos(angle), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
gl_Position = a_position;
gl_Position *= rotationMatrix;
これは 2D レンダリング用であり、3D の経験のないエンジニアに渡されるため、MVP マトリックスを渡すことは避けて、基本的なスケール、回転、および移動変数をプッシュすることをお勧めします (10 回目の部分的なマトリックス ライブラリの作成はスキップします)。 )。
マトリックス演算とシェーダーに悩まされるのは久しぶりなので、小さなエラーであることを願っています。
ご協力いただきありがとうございます!
編集/更新:
後処理パスが角度を壊していることに気付きました。
Z 回転がクワッドをスケーリングしているように見えることがわかりました。これは n00b の問題であることを覚えており、調査中です...
安価な一時投影マトリックスがあることを忘れていました
//s_scalefactor is for retina vs non-retina display
highp mat4 projectionMatrix = mat4( 2.0/(320.0 * s_scalefactor), 0.0, 0.0, -1.0,
0.0, 2.0/(480.0 * s_scalefactor), 0.0, -1.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
gl_Position *= projectionMatrix;
安価なハックですが、Z 回転が硬くなるかどうかはわかりません。
編集#2:
また、オルソの代わりに錐台を使用して、シェーダーの外部で行列を計算しようとしても、どこにも行きませんでした。