package net.npaka.gl10textureex3; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLUtils;
//レンダラー public class GLRenderer implements GLSurfaceView.Renderer { //システム private Activity activity;//アクティビティ //バッファ private FloatBuffer vertexBuffer;//頂点バッファ //テクスチャ private int textureId;//テクスチャID //コンストラクタ public GLRenderer(Activity activity) { this.activity=activity; } //サーフェイス生成時に呼ばれる @Override public void onSurfaceCreated(GL10 gl10,EGLConfig eglConfig) { //頂点配列の有効化 gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY); //テクスチャの有効化 gl10.glEnable(GL10.GL_TEXTURE_2D); //ポイントスプライトの有効化 gl10.glEnable(GL11.GL_POINT_SPRITE_OES); //テクスチャの生成 Bitmap bmp=BitmapFactory.decodeResource( activity.getResources(),R.drawable.sample); textureId=makeTexture(gl10,bmp); //ブレンドの指定 gl10.glEnable(GL10.GL_BLEND); gl10.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);
//頂点バッファの生成 vertexBuffer=makeFloatBuffer(new float[]{0,0,0}); } //画面サイズ変更時に呼ばれる @Override public void onSurfaceChanged(GL10 gl10,int w,int h) { //画面の表示領域の指定 gl10.glViewport(0,0,w,h); } //毎フレーム描画時に呼ばれる @Override public void onDrawFrame(GL10 gl10) { //画面のクリア gl10.glClearColor(1.0f,1.0f,1.0f,1.0f); gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); //ポイントスプライトの描画 gl10.glActiveTexture(GL10.GL_TEXTURE0); gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId); gl10.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES,GL10.GL_TRUE); gl10.glPointSize(64.0f); gl10.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer); gl10.glDrawArrays(GL10.GL_POINTS,0,1); } //テクスチャの生成 private int makeTexture(GL10 gl10,Bitmap bmp) { //テクスチャメモリの確保 int[] textureIds=new int[1]; gl10.glGenTextures(1,textureIds,0); //テクスチャへのビットマップ指定 gl10.glActiveTexture(GL10.GL_TEXTURE0); gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureIds[0]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0); //テクスチャフィルタの指定 gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST); gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST); return textureIds[0]; } //float配列をFloatBufferに変換 private FloatBuffer makeFloatBuffer(float[] array) { FloatBuffer fb=ByteBuffer.allocateDirect(array.length*4).order( ByteOrder.nativeOrder()).asFloatBuffer(); fb.put(array).position(0); return fb; } }
|