Android的GLSurfaceView测试源码

来源:互联网 发布:数据新闻比赛官网 编辑:程序博客网 时间:2024/05/19 06:51
public class MainActivity extends Activity {private GLSurfaceView mGLView; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGLView = new DemoGLSurfaceView(this);        setContentView(mGLView); }    public void onPause(){          super.onPause();          mGLView.onPause();      }            public void onResume(){          super.onResume();          mGLView.onResume();     }         protected void onDestroy() {super.onDestroy();mGLView.destroyDrawingCache();}}class DemoGLSurfaceView extends GLSurfaceView{  DemoRenderer mRenderer;      public DemoGLSurfaceView(Context context) {          super(context);          //为了可以激活log和错误检查,帮助调试3D应用,需要调用setDebugFlags()。          //this.setDebugFlags(DEBUG_CHECK_GL_ERROR|DEBUG_LOG_GL_CALLS);          mRenderer = new DemoRenderer();          this.setRenderer(mRenderer);      }            public boolean onTouchEvent(final MotionEvent event){          //由于DemoRenderer对象运行在另一个线程中,这里采用跨线程的机制进行处理。使用queueEvent方法          //当然也可以使用其他像Synchronized来进行UI线程和渲染线程进行通信。          this.queueEvent(new Runnable() {               @Override              public void run() {                  mRenderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f);              }          });          return true;      }   }  class DemoRenderer implements Renderer {private float mRed;private float mGreen;private float mBlue;//三角形的三个顶点private FloatBuffer mTriangleBuffer;private float[] mTriangleArray = {0f,1f,0f,-1f,-1f,0f,1f,-1f,0f};//正方形的四个顶点private FloatBuffer quateBuffer ;private float[] mQuateArray = {-1f, -1f, 0f,1f, -1f, 0f,-1f, 1f, 0f,1f, 1f, 0f,};private FloatBuffer mColorBuffer;private float[] mColorArray={1f,0f,0f,1f,     //红0f,1f,0f,1f,     //绿0f,0f,1f,1f      //蓝};public void setColor(float r, float g, float b) {this.mRed = r;this.mGreen = g;this.mBlue = b;}@Overridepublic void onDrawFrame(GL10 gl) {gl.glClearColor(mRed, mGreen, mBlue, 1.0f);gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);//使用数组作为颜色gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);//绘制三角形gl.glLoadIdentity();gl.glTranslatef(-1.5f, 0.0f, -6.0f);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glFinish();//绘制正方形gl.glLoadIdentity();gl.glTranslatef(1.5f, 0.0f, -6.0f);gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);gl.glFinish();}@Overridepublic void onSurfaceChanged(GL10 gl, int w, int h) {gl.glViewport(0, 0, w, h);float ratio = (float) w / h;gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {gl.glShadeModel(GL10.GL_SMOOTH);gl.glClearColor(1.0f, 1.0f, 1.0f, 0f);gl.glClearDepthf(1.0f);gl.glEnable(GL10.GL_DEPTH_TEST);gl.glDepthFunc(GL10.GL_LEQUAL);gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);mTriangleBuffer = floatToBuffer(mTriangleArray);mColorBuffer = floatToBuffer(mColorArray);quateBuffer = floatToBuffer(mQuateArray);}private static FloatBuffer floatToBuffer(float[] a){//先初始化buffer,数组的长度*4,因为一个float占4个字节ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);//数组排序用nativeOrdermbb.order(ByteOrder.nativeOrder());FloatBuffer mBuffer = mbb.asFloatBuffer();mBuffer.put(a);mBuffer.position(0);return mBuffer;}}

0 0
原创粉丝点击