Android OpenGL
1什么是OpenGL?
OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开的IRISGL。IRISGL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRISGL的基础上开发OpenGL。
2OpenGL的发展历程
1992年7月发布了OpenGL1.0版本,并与微软共同推出WindowsNT版本的OpenGL。
1995年OpenGL1.1版本面市,加入了新功能,并引入了纹理特性等等。
一直到2009年8月Khronos小组发布了OpenGL3.2,这是一年以来OpenGL进行的第三次重要升级。
3OpenGLES简介
Android3D引擎采用的是OpenGLES。OpenGLES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3DAPI进行竞争,OpenGL和DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是OpenGL具有更好的跨平台性。
由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的OpenGL系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。
4AndroidOpenGLES简介
Android系统使用OpenGL的标准接口来支持3D图形功能,android3D图形系统也分为java框架和本地代码两部分。本地代码主要实现的OpenGL接口的库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,android.opengl包提供了OpenGL系统和AndroidGUI系统之间的联系。
5Android支持OpenGL列表
*GL
*GL10
*GL10EXT
*GL11
*GL11EXT
*GL11ExtensionPack
6GLSurfaceView
Android中提供了GLSurfaceView用于显示OpenGL渲染,GLSurfaceView包含了以下功能:
*在OpenGLES和View系统之间建立联系;
*使得OpenGLES可以工作在Activity生命周期中;
*可选择合适的framebuffer像素格式;
*创建并管理一个单独的渲染线程,可以实现平滑的动画;
*提供debugging工具和API。
publicvoidsetRenderer(GLSurfaceView.Rendererrenderer)提供了渲染方法
7GLSurfaceView.Renderer
普通的渲染接口,当你创建自己的render时需要实现这个接口同时重写一些方法。然后通过GLSurfaceView的setRenderer(GLSurfaceView.Renderer)将自己的render渲染到GLSurfaceView中,实现GLSurfaceView.Renderer时,你需要实现以下三个方法:
*publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig)
该方法在渲染开始前调用,OpenGLES的绘制上下文被重建时也会被调用。当activity暂停时绘制上下文会丢失,当activity继续时,绘制上下文会被重建。通俗的来说在渲染的过程中一些不经常变换的,可以在这个方法里面设置,比方说:创建长期存在的OpenGL资源(如texture)往往也在这里进行。
*publicvoidonDrawFrame(GL10gl)
通常这个方法中就是实际绘画的地方,每帧都通过该方法进行绘制。绘制时通常先调用glClear 函数来清空framebuffer,然后在调用OpenGLES的起它的接口进行绘制。
*publicvoidonSurfaceChanged(GL10gl,intwidth,intheight)
surface的尺寸发生改变时该方法被调用(横竖屏切换时)。往往在这里设置viewport。若你的camera是固定的,也可以在这里设置camera。
8应用示例
了解完GLSurfaceView和GLSurfaceView.Render之后,接下来我们开始实际操刀:
1.创建Activity:
viewplaincopytoclipboardprint?
1.packagese.jayway.opengl.tutorial;
2.
3.importandroid.app.Activity;
4.importandroid.opengl.GLSurfaceView;
5.importandroid.os.Bundle;
6.
7.publicclassTutorialPartIextendsActivity{
8./**Calledwhentheactivityisfirstcreated.*/
9.@Override
10.publicvoidonCreate(BundlesavedInstanceState){
11.super.onCreate(savedInstanceState);
12.GLSurfaceViewview=newGLSurfaceView(this);
13.view.setRenderer(newOpenGLRenderer());
14.setContentView(view);
15.}
16.}
packagese.jayway.opengl.tutorial;
importandroid.app.Activity;
importandroid.opengl.GLSurfaceView;
importandroid.os.Bundle;
publicclassTutorialPartIextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
GLSurfaceViewview=newGLSurfaceView(this);
view.setRenderer(newOpenGLRenderer());
setContentView(view);
}
}
1.创建Render:packagese.jayway.opengl.tutorial;
viewplaincopytoclipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
1.packagese.jayway.opengl.tutorial;
2.importjavax.microedition.khronos.egl.EGLConfig;
3.importjavax.microedition.khronos.opengles.GL10;
4.importandroid.opengl.GLU;
5.importandroid.opengl.GLSurfaceView.Renderer;
6.publicclassOpenGLRendererimplementsRenderer{
7./*
8.*@see
9.*android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax.
10.*microedition.khronos.opengles.GL10,javax.microedition.khronos.
11.*egl.EGLConfig)
12.*/
13.publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
14.//Setthebackgroundcolortoblack(rgba).
15.gl.glClearColor(0.0f,0.0f,0.0f,0.5f);//OpenGLdocs.
16.//EnableSmoothShading,defaultnotreallyneeded.
17.gl.glShadeModel(GL10.GL_SMOOTH);//OpenGLdocs.
18.//Depthbuffersetup.
19.gl.glClearDepthf(1.0f);//OpenGLdocs.
20.//Enablesdepthtesting.
21.gl.glEnable(GL10.GL_DEPTH_TEST);//OpenGLdocs.
22.//Thetypeofdepthtestingtodo.
23.gl.glDepthFunc(GL10.GL_LEQUAL);//OpenGLdocs.
24.//Reallyniceperspectivecalculations.
25.gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,//OpenGLdocs.
26.GL10.GL_NICEST);
27.}
28./*
29.*@see
30.*android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax.
31.*microedition.khronos.opengles.GL10)
32.*/
33.publicvoidonDrawFrame(GL10gl){
34.//Clearsthescreenanddepthbuffer.
35.gl.glClear(GL10.GL_COLOR_BUFFER_BIT|//OpenGLdocs.
36.GL10.GL_DEPTH_BUFFER_BIT);
37.}
38./*
39.*@see
40.*android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax.
41.*microedition.khronos.opengles.GL10,int,int)
42.*/
43.publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
44.//Setsthecurrentviewporttothenewsize.
45.gl.glViewport(0,0,width,height);//OpenGLdocs.
46.//Selecttheprojectionmatrix
47.gl.glMatrixMode(GL10.GL_PROJECTION);//OpenGLdocs.
48.//Resettheprojectionmatrix
49.gl.glLoadIdentity();//OpenGLdocs.
50.//Calculatetheaspectratioofthewindow
51.GLU.gluPerspective(gl,45.0f,
52.(float)width/(float)height,
53.0.1f,100.0f);
54.//Selectthemodelviewmatrix
55.gl.glMatrixMode(GL10.GL_MODELVIEW);//OpenGLdocs.
56.//Resetthemodelviewmatrix
57.gl.glLoadIdentity();//OpenGLdocs.
58.}
59.}