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.}

相关推荐