前回(【Android】アンドロイドでOpenGLを使ってみる(準備編))からの続きでOpenGLを使ってみます。
OpenGLといったら3Dというイメージがありますが、
今回は2D機能だけを使い奥行きのないペラペラしたオブジェクトにテクスチャを貼ってみる方法を紹介してみます。
AndroidでOpenGLを使う良い解説本はないものかと本屋をウロウロしていると。
OpenGL ESを使ったAndroid 2D/3Dゲームプログラミング
見つけました。さっそく買って読んでみたんですが、とっても解りやすいです(^ω^)
今回は2D機能だけですが、上記の本では3Dを使った描画処理も紹介しています。
(とっても使いやすいHyperMotion3Dは筆者の大西武さんのサイトからDLできます)
この本の内容を参考にしながら2Dテクスチャを使った描画処理を紹介してみます。
2次元スプライト用のクラスを作成する
私はまったくグラフィック関連の知識がないのでテクスチャと聞いてピンと来なかったのですが、
オブジェクト表面に貼り付けられるシールのようなものと考えればよいそうです。
テクスチャに貼り付ける画像はpngを用意します。

みんな大好き比那名居天子さんです。
画像のサイズは2の累乗にしないといけないらしいので、512x256にしてあります。
HyperMotion3DのクラスSprite2Dを参考にしながら、
上記のpng画像の読込と描画を行うSampleSpriteクラスを作成します。
・SampleSprite.java
01 | import java.io.IOException; |
02 | import java.io.InputStream; |
03 | import javax.microedition.khronos.opengles.GL10; |
04 | import javax.microedition.khronos.opengles.GL11; |
05 | import javax.microedition.khronos.opengles.GL11Ext; |
07 | import android.content.res.Resources; |
08 | import android.graphics.Bitmap; |
09 | import android.graphics.BitmapFactory; |
10 | import android.opengl.GLUtils; |
12 | public class SampleSprite { |
28 | public void setTexture( GL10 gl, Resources res, int id ){ |
29 | InputStream is = res.openRawResource(id); |
32 | bitmap = BitmapFactory.decodeStream(is); |
38 | catch (IOException e){ } |
40 | gl.glEnable(GL10.GL_ALPHA_TEST); |
41 | gl.glEnable(GL10.GL_BLEND); |
42 | gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); |
43 | gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); |
45 | int [] textureID = new int [ 1 ]; |
46 | gl.glGenTextures( 1 , textureID, 0 ); |
47 | textureNo = textureID[ 0 ]; |
50 | gl.glBindTexture(GL10.GL_TEXTURE_2D, textureNo); |
52 | GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0 , bitmap, 0 ); |
54 | gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT ); |
55 | gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT ); |
57 | gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR ); |
58 | gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR ); |
61 | texY = bitmap.getHeight(); |
62 | texWidth = bitmap.getWidth(); |
63 | texHeight = -bitmap.getHeight(); |
67 | width = bitmap.getWidth(); |
68 | height = bitmap.getHeight(); |
71 | public void draw( GL10 gl){ |
72 | gl.glDisable(GL10.GL_DEPTH_TEST); |
74 | gl.glColor4x( 0x10000 , 0x10000 , 0x10000 , 0x10000 ); |
76 | gl.glActiveTexture(GL10.GL_TEXTURE0); |
78 | gl.glBindTexture(GL10.GL_TEXTURE_2D, textureNo); |
80 | int rect[] = { texX, texY, texWidth, texHeight}; |
82 | ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,GL11Ext.GL_TEXTURE_CROP_RECT_OES, rect, 0 ); |
84 | ((GL11Ext) gl).glDrawTexfOES( pos_x, pos_y, pos_z, width, height); |
86 | gl.glEnable(GL10.GL_DEPTH_TEST); |
なかなか長くなってしまいました(´ω`)
アルファとかブレンドなどグラフィック関連の言葉がわからず逐一調べてなんとなく理解…。
・setTexture関数
リソースIDからBitmapのインスタンスを取得。
その後はしばらくOpenGLの初期設定(内容は書いてある通りだと思います)
60~68行目あたりで画像の座標、幅と高さをセットしています。
・draw関数
描画処理です。
setTexture関数でセットした通りの内容を描画してくれるはずです。
実際にGLSurfaceViewの中で2Dテクスチャを描画してみる
前回の記事で作成したからっぽのRendererクラスに処理を追加します。
・SampleRenderer.java
01 | import javax.microedition.khronos.egl.EGLConfig; |
02 | import javax.microedition.khronos.opengles.GL10; |
03 | import android.content.Context; |
04 | import android.opengl.GLSurfaceView.Renderer; |
05 | import android.opengl.GLU; |
07 | public class SampleRenderer implements Renderer{ |
09 | private Context context; |
12 | SampleSprite tenshi_img = new SampleSprite(); |
14 | public SampleRenderer(Context _context){ |
19 | public void onDrawFrame(GL10 gl) { |
21 | gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); |
26 | public void onSurfaceChanged(GL10 gl, int width, int height) { |
27 | gl.glViewport( 0 , 0 , width, height); |
28 | gl.glMatrixMode(GL10.GL_PROJECTION); |
29 | GLU.gluOrtho2D(gl, 0 .0f, width, 0 .0f, height); |
33 | public void onSurfaceCreated(GL10 gl, EGLConfig config) { |
35 | gl.glClearColor( 1 .0f, 1 .0f, 1 .0f, 1 .0f); |
37 | gl.glDisable(GL10.GL_DITHER); |
39 | gl.glEnable(GL10.GL_DEPTH_TEST); |
41 | gl.glEnable(GL10.GL_TEXTURE_2D); |
43 | gl.glEnable(GL10.GL_ALPHA_TEST); |
45 | gl.glEnable(GL10.GL_BLEND); |
46 | gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); |
48 | tenshi_img.setTexture(gl,context.getResources(),R.drawable.sample_img); |
・34~46
OpenGLの設定です。
・48
リソースIDを渡してテクスチャをセットしています。
・20~22
画面をクリアして、テキスチャを描画。
【実行結果】
SampleSpriteクラスのsetTexture関数を変更すると、
画像の位置を変えたり画像を引き伸ばして表示できます。
4 | width = bitmap.getWidth()* 2 ; |
5 | height = bitmap.getHeight(); |
【実行結果】

ぐんにょり。
ピンバック: 【Android】アンドロイドでOpenGLを使ってみる(2Dアニメーション編) | 桜花満開
ピンバック: 【Androidアプリ開発】オープンソースゲームエンジン「Andengine」を導入してみる | 桜花満開/テンシホタル