package com.andy.test; import android.app.Activity; import android.os.Bundle; public class TestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MySurfaceView(this)); } }
/** * @author andy.xie <andy_xiexh@163.com> * @date 2012-7-19 * @filename MySurfaceView.java */ package com.andy.test; 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 android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLUtils; public class MySurfaceView extends GLSurfaceView{ public MySurfaceView(Context context) { super(context); // TODO Auto-generated constructor stub setRenderer(new MyRenderer()); } private class MyRenderer implements Renderer { float vertices[]=new float[] { -1, -1, 1, -1, 0, 1 }; float textureCoors[]=new float[] { 0, 1, 1,1, 0.5f,0, }; FloatBuffer mVertexBuffer, mTexCoordBuffer; int mTexId; public MyRenderer() { // TODO Auto-generated constructor stub ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder());//设置字节顺序 mVertexBuffer = vbb.asFloatBuffer();//转换为int型缓冲 mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据 mVertexBuffer.position(0);//设置缓冲区起始位置 ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4); cbb.order(ByteOrder.nativeOrder());//设置字节顺序 mTexCoordBuffer = cbb.asFloatBuffer();//转换为int型缓冲 mTexCoordBuffer.put(textureCoors);//向缓冲区中放入顶点着色数据 mTexCoordBuffer.position(0);//设置缓冲区起始位置 } private int initTexture(GL10 gl, Bitmap bitmap) { // TODO Auto-generated method stub int[] textures = new int[1]; gl.glEnable(GL10.GL_TEXTURE_2D); gl.glGenTextures(1, textures, 0); int currTextureId = textures[0]; gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId); 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_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); return currTextureId; } @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer ( 2, GL10.GL_FLOAT, 0, mVertexBuffer ); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer ( 2, //每个顶点两个纹理坐标数据 S、T GL10.GL_FLOAT, //数据类型 0, //连续纹理坐标数据之间的间隔 mTexCoordBuffer //纹理坐标数据 ); gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexId); gl.glDrawArrays ( GL10.GL_TRIANGLES, 0, 3 ); gl.glDisable(GL10.GL_TEXTURE_2D);//关闭纹理 } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub gl.glViewport(0, 0, width, height); //设置当前矩阵为投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION); //设置当前矩阵为单位矩阵 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); mTexId = initTexture(gl, bitmap); } } }