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

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

2Dテクスチャの表示を別メソッドに切り出す。

GraphicUtilsクラスにdrawTextureRectangleメソッドを追加。

	/**
	 * テクスチャを四角形で描画
	 */
	public static void drawTextureRectangle(GL10 gl, Context context, final float x, final float y,
			final float width, final float height,int textureId,
			final int red, final int green, final int blue, final int alpha){

		final float [] squares = new float[]{
				-0.5f * width  + x, -0.5f * height + y, 0.0f,
				 0.5f * width  + x, -0.5f * height + y, 0.0f,
				-0.5f * width  + x,  0.5f * height + y, 0.0f,
				 0.5f * width  + x,  0.5f * height + y, 0.0f,
			};

		final float [] texCoords = new float[]{
				0.0f, 1.0f,
				1.0f, 1.0f,
				0.0f, 0.0f,
				1.0f, 0.0f,
		};


		gl.glEnable(GL10.GL_TEXTURE_2D);//テクスチャ機能を有効化
		gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);//テクスチャオブジェクトをバインド


		//ポリゴン描画
		gl.glVertexPointer(ONE_POINT_DATA_NUM, GL10.GL_FLOAT, 0, getFloatBuffer(squares));//描画する頂点配列を設定
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//頂点配列を有効にする。

		gl.glColor4x(red, green, blue,  alpha);

		final int POLYGON_NUM = 4;
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, POLYGON_NUM);

		gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0,  getFloatBuffer(texCoords));
		gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

		gl.glDisable(GL10.GL_TEXTURE_2D);//テクスチャ機能を無効化


	}

GLRenderクラスは次の通り。

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import javax.microedition.khronos.opengles.GL11Ext;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;

import static jp.mprog.GraphicUtils.*;

public class GLRenderer implements GLSurfaceView.Renderer  {

	private Context context;
	private int textureId;

	public GLRenderer(Context context){
		this.context = context;
	}


	@Override
	public void onDrawFrame(GL10 gl) {

		GraphicUtils.makeWorld(gl);

		int one = 0x10000;
		int half = 0x08000;



		drawTextureRectangle(gl,context,0.5f,0.7f,1.0f, 1.0f, textureId, 0, 0, 0, 0 );
		drawTextureRectangle(gl,context,0.0f,0.0f,1.0f, 1.0f, textureId, one, one, one, one );




	}

	/**
	 * サーフェイスのサイズ変更時に実行される。
	 */
	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {

		System.out.println("@@@ w:h="+width + ":"+height);

		gl.glViewport(0, 0, width, height);



	}



	/**
	 * サーフェスが生成・再生成される時に実行される。
	 */
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {

		textureId = TextureLoader.loadTexture(gl, context, R.drawable.robot);//リソース読み込み

	}



}

1つのテクスチャが位置を変えて2回表示される。