Android的GLSurfaceView测试源码

public class MainActivity extends Activity {

	private GLSurfaceView mGLView; 
	@Override
	protected 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;
	}

	@Override
	public 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();
	}

	@Override
	public 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();
	}

	@Override
	public 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);
		//数组排序用nativeOrder
		mbb.order(ByteOrder.nativeOrder());
		FloatBuffer mBuffer = mbb.asFloatBuffer();
		mBuffer.put(a);
		mBuffer.position(0);
		return mBuffer;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值