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

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

テクスチャマッピングで数字を表示。

512x512の数字画像をWindows7のペイントで作成。

GraphicUtilsクラスにテクスチャマッピングを行うメソッドをリファクタリングして新たなメソッドを追加。

	/**
	 * テクスチャマッピングでテクスチャの一部分だけを四角形で描画
	 */
	public static void drawTextureRectangle(GL10 gl, Context context, final float x, final float y,
			final float width, final float height,int textureId,
			final float u, final float v, final float textureWidth, final float textureHeight,
			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 [] textureCoords = new float[]{
				u, v + textureHeight,
				u + textureWidth, v + textureHeight,
				u, v,
				u + textureWidth, v,
		};

		drawTextureRectangle(gl,context,x,y,width,height,textureId,squares, textureCoords,red,green,blue,alpha);

	}




	/**
	 * テクスチャを四角形で描画
	 */
	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,
		};


		drawTextureRectangle(gl,context,x,y,width,height,textureId,squares, texCoords,red,green,blue,alpha);

	}

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

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

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

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


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

	}

ペイントで作成した画像ではアルファブレンドが効かなかったので、『OpenGLで作るiPhone SDKゲームプログラミング』サポートページからダウンロードした数字画像をres/drawable-*/フォルダにコピー。
GLRendererクラスのonSurfaceCreatedメソッドにテクスチャの読み込みを追加。
自分で作成した画像を使用する場合は、アルファ付きの画像にしないとアルファブレンドが効かないみたい。

numberTextureId =  TextureLoader.loadTexture(gl, context, R.drawable.number_texture);

onDrawFrameメソッドにテクスチャを表示する処理を追加。

		gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);//アルファブレンディング
		gl.glEnable(GL10.GL_BLEND);

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


		drawTextureRectangle(gl, context, -0.5f, 0.5f, 1.0f, 1.0f, numberTextureId, one, one, one, half);//全体を描画
		drawTextureRectangle(gl, context, 0.5f, 0.5f, 1.0f, 1.0f, numberTextureId,
				0.0f, 0.0f,0.25f,0.25f,
				one, one, one, one); //0の部分だけを描画
		drawTextureRectangle(gl, context, -0.5f, -0.5f, 1.0f, 1.0f, numberTextureId,
				0.50f, 0.25f,0.25f,0.25f,
				one, one, one, one); //6の部分だけを描画
		drawTextureRectangle(gl, context, 0.5f, -0.5f, 1.0f, 1.0f, numberTextureId,
				0.25f, 0.50f,0.25f,0.25f,
				one, one, one, half); //9の部分だけを描画


		gl.glDisable(GL10.GL_BLEND);