JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

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;
	}

}