2

私は最近、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:

また、オルソの代わりに錐台を使用して、シェーダーの外部で行列を計算しようとしても、どこにも行きませんでした。

4

1 に答える 1

1

私は同じ問題を抱えていましたが、それは非常に奇妙でした。コンストラクターを使用するのではなく、アクセサー演算子を使用して mat4 構造を設定することで解決できました。

mat4 rotateZ;
rotateZ[0].x    = cosAngle;
rotateZ[0].y    = negSinAngle;
rotateZ[0].z    = 0.0;
rotateZ[0].w    = 0.0;
rotateZ[1].x    = sinAngle;
rotateZ[1].y    = cosAngle;
rotateZ[1].z    = 0.0;
rotateZ[1].w    = 0.0;
rotateZ[2].x    = 0.0;
rotateZ[2].y    = 0.0;
rotateZ[2].z    = 1.0;
rotateZ[2].w    = 0.0;
rotateZ[3].x    = 0.0;
rotateZ[3].y    = 0.0;
rotateZ[3].z    = 0.0;
rotateZ[3].w    = 1.0;
于 2011-11-29T19:58:10.580 に答える