android开发之OpenGL(一)
OpenGL 初步介绍:
1.了解一下android的OpenGL
Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的 OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java标准的 OpenGL 包,android.opengl包提供了 OpenGL 系统和 Android GUI 系统之间的联系。
Android 支持 OpenGL 列表
- 1、GL
- 2、GL 10
- 3、GL 10 EXT
- 4、GL 11
- 5、GL 11 EXT
- 6、GL 11 ExtensionPack
2.实践是最好的学习方法。
新建一个项目,如图
Opengl2Activity.java的代码为:
1 Renderer renderer = new OpenGLRenderer(); 2 @Override 3 public void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 GLSurfaceView view = new GLSurfaceView(this); 6 view.setRenderer(renderer); 7 setContentView(view); 8 }
openGLRenderer中有三个必须要实现的三个方法:
- onSurfaceCreated(GL10 gl, EGLConfig config) ---->初始化
-
1 public void onSurfaceCreated(GL10 gl, EGLConfig config) { 2 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 3 4 gl.glShadeModel(GL10.GL_SMOOTH); 5 6 gl.glClearDepthf(1.0f); 7 8 gl.glEnable(GL10.GL_DEPTH_TEST); 9 10 gl.glDepthFunc(GL10.GL_LEQUAL); 11 12 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 13 }
-
- onDrawFrame(GL10 gl) ---->画图
-
public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(-2.0f, 0.0f, -6.0f); gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f); // 启用定点数组 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 设置三角形顶点 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, TrianBuffer); // 绘制三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); /* 渲染正方形 */ // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 左移 1.5 单位,并移入屏幕 6.0 gl.glTranslatef(2.0f, 0.0f, -6.0f); //设置颜色 gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); // 设置和绘制正方形 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, QuaterBuffer); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // 取消顶点数组 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }
-
- onSurfaceChanged(GL10 gl, int width, int height) ---->当屏幕大小改变时被调用
-
public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); }
-
- 设置三角形与矩形的顶点数据
-
private float trianvertices[] = { 0.0f, 2.0f, 0.0f, // 上顶点 -2.0f, -2.0f, 0.0f, // 坐下点 2.0f, -2.0f, 0.0f, // 右下点 }; private FloatBuffer TrianBuffer; private float quatervertices[] = { 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, -1.0f, 0.0f }; private FloatBuffer QuaterBuffer;
- 构造函数把顶点数据转换成FloatBuffer类型。以便gl.glVertexPointer(int size,int type,int stride,Buffer pointer);
public OpenGLRenderer() { ByteBuffer tbb = ByteBuffer.allocateDirect(trianvertices.length * 4); tbb.order(ByteOrder.nativeOrder()); TrianBuffer = tbb.asFloatBuffer(); TrianBuffer.put(trianvertices); TrianBuffer.position(0); // 这里设置四边形的顶点数据 ByteBuffer qbb = ByteBuffer.allocateDirect(quatervertices.length * 4); qbb.order(ByteOrder.nativeOrder()); QuaterBuffer = qbb.asFloatBuffer(); QuaterBuffer.put(quatervertices); QuaterBuffer.position(0); }
3.最终效果图:
我要青春像陈孝正一样,不能有一毫米的误差!
我要青春像合伙人一样,为了自尊而战!