2Dテクスチャを表示する。
表示する画像はAPIデモの中にあるrobot.png。
入門Google Androidプログラミングのサンプルほぼそのまま。
public class GLRenderer implements GLSurfaceView.Renderer { private Context context; private int textureId; public GLRenderer(Context context){ this.context = context; } private float getPosition(int count){ return (float)count * 0.4f - 0.8f; } @Override public void onDrawFrame(GL10 gl) { GraphicUtils.makeWorld(gl); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glColor4x(one, one, one, one); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0.375f, 0.375f, 0.0f); gl.glActiveTexture(GL10.GL_TEXTURE0); gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); gl.glEnable(GL10.GL_TEXTURE_2D); int [] rect = {0,128,128,-128}; ((GL11)gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, rect,0); ((GL11Ext)gl).glDrawTexiOES(0, 0,0,128,128); } /** * サーフェイスのサイズ変更時に実行される。 */ @Override public void onSurfaceChanged(GL10 gl, int width, int height) { System.out.println("@@@ w:h="+width + ":"+height); gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION);//射影行列をセント無く gl.glLoadIdentity();//現在選択されている行列(射影行列)に単位行列をセット GLU.gluOrtho2D(gl, 0.0f, width, 0.0f, height);//平行投影用のパラメータをセット } /** * サーフェスが生成・再生成される時に実行される。 */ @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColorx(0, 0, 0, 1); gl.glShadeModel(GL10.GL_FLAT);//フラットシェーディング textureId = TextureLoader.loadTexture(gl, context, R.drawable.robot);//リソース読み込み }
TextureLoaderクラス
import java.io.IOException; import java.io.InputStream; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLUtils; public class TextureLoader { /** * resouceIdで指定された画像をテクスチャとして読み込む。 * @param gl * @param context * @param resouceId * @return */ public static int loadTexture(GL10 gl, Context context, int resouceId ){ int[] textures = new int[1]; gl.glGenTextures(1, textures, 0);//テクスチャオブジェクトを作成 int textureId = textures[0];//作成したテクスチャのIDを設定 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);//テクスチャIDを2Dテクスチャとしてバインド。 //バインドしたテクスチャのパラメータを設定 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);//テクスチャの縮小方法を設定 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);//テクスチャの拡大方法を設定 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);//テクスチャの繰り返し方法を設定 gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);//テクスチャの色で下地の色を置き換える InputStream is = context.getResources().openRawResource(resouceId); Bitmap bitmap; try { bitmap = BitmapFactory.decodeStream(is); } finally { try { is.close(); } catch(IOException e) { // Ignore. e.printStackTrace(); } } GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); return textureId; } }