您的位置:首页 > 移动开发 > Android开发

Android的GLSurfaceView测试源码

2016-06-08 11:13 411 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: