OpenGL ESで2Dテクスチャを回転させるときの注意点

Androidアプリは本当に開発しづらい。2D描画の性能も悪く、Canvasへビットマップを数個貼るだけでも30FPSを切るから、アニメーションのあるUIや2DゲームでもOpenGLを使わざるを得ない。

そこで買い求めたのが「初めてのOpenGL ES(山下武志・著)」。インターネットで他の人が紹介している技術情報は「2D描画したい? じゃあ、このソースを使ってよ」で完結していて、なぜそうプログラムを書かないといけないかは全く触れていないため、初心者だとほとんど応用が利かない。この本はその「なぜそう記述しないといけないか」が図解入りで丁寧に書かれているため、大変参考になった。Androidでゲームエンジンを使うほどではないが、2Dグラフィックを高速に描画したいという方におすすめだ。

さて、ここで問題に行き当たったわけだが、行列の項目で紹介されているサンプルコードをそのまま使うと、回転するときにテクスチャが平行四辺形のようにゆがんでしまう。本文の解説には「ビューポートの設定上、多少歪んでいます」という注釈があるものの、そのビューポートをどうすればよいかについては言及されていない。そこで、フォーラムで訪ねたところ、著者本人から直々に対策を教えていただけたので、その解決方法をご紹介。

結論から言えば、テクスチャは画面のアスペクト比にゆがむため、回転行列の前後にアスペクト比を調整するための拡大行列を付け加えるとよい。より突っ込んだプログラミングについては書籍を参考にされたし。
gl.glScalef(1.0f / aspect, 1.0f, 1.0f); gl.glRotatef(degree, 0, 0, 1); gl.glScalef(sizeX * aspect, sizeY, 1.0f);
2012/10/31