标签:
OpenGL的全称是Open Graphics Library,即开放的图形库接口,它定义了一个跨编程语言,跨平台的编程接口的规范,它主要用于3D图形(2D也可以)编程。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS RL是一个工业标准的3D图形软件接口,功能虽然强大,但是移植性不好,于是SGI公司在IRIS GL的基础上开发了OpenGL。
OpenGL体系简单,而且具有跨平台特性,它不像Direct3D,是Microsoft开发的windows平台下的图形接口,只能在windows系统上运行。因此OpenGL具有很广泛的适应性,不仅用于大型工作站,也用于个人PC。
在图形工作站,个人PC上,OpenGL都可以很好的工作。但三维图形计算需要处理大量数据,因此在一些手机之类小型设备上,如果继续用OpenGL,就显得比较困难。为了解决这个问题,Khronos集团问OpenGL提供了一个子集:OpenGL ES(OpenGL for Embedded System,即为嵌入式系统优化的OpenGL)。
Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准,Khronos协会针对手机,PDA(个人数据助手)和游戏主机等嵌入式设备设置了OpenGL ES。
OpenGL ES是免费的、跨平台的、功能完备的2D/3D图形库接口API,它针对多种嵌入式系统(包括控制台,手机,手持设备,家电,汽车)专门设计,他是一个精心提取的OpenGL子集。
OpenGL ES剔除了OpenGL中的glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等许多非绝对必要的特性。经过多年发展,目前OpenGL ES主要有两个版本,OpenGL ES 1.x针对固定管线硬件;OpenGL ES 2.x针对可编程管线硬件。
OpenGL ES 1.0是以OpenGL 1.3规范为基础的,OpenGL ES 1.1是以OpenGL ES 1.5规范为基础的,分别支持common和common lite两种profile。lite profile只支持定点实数,而common profile及支持定点数又支持浮点数。
目前Android SDK已经支持OpenGL ES 2.0绝大多数功能,封装在android.opengl包里。
android中OpenGL ES提供了GLSurfaceView组件,用于显示3D图形。GLSurfaceView本身布提供3D绘图功能,而是由GLSurfaceView.Renderer来进行SurfaceView中的3D图形绘制。
1、创建GLSurfaceView组件,使用Activity来显示GLSurfaceView组件。
2、为GLSurfaceView组件创建GLSurfaceView.Renderer实例,实现它时,需要重写该接口的三个方法:
- abstract void onDrawFrame(GL10 gl):Renderer对象调用该方法绘制GLSurfaceView的当前帧。
- abstract void onSurfaceChanged(GL10 gl,int width,int height):当前GLSurfaceView的大小改变时, 回调该方法。
- abstract void onSurfaceCreated(GL10 gl,EGLConfig config):当GLSurfaceView被创建时回调该方法
3、调用GLSurfaceView组件的setRenderer()方法,指定Renderer对象,该Renderer对象将会完成GLSurfaceView里的3D图形绘制。
所以,绘制3D图形的难点,不是如何使用GLSurface组件,而是实现Renderer类。实现Renderer类时的三个方法(如上)中的GL10形参,为GLOpen ES的“画笔”,类似重写View时,onDraw()方法里的Canvas组件。
当SurfaceView被创建时,回调Renderer对象的onSurfaceCreated()方法,该方法里执行一些无需任何改变的初始化。如下:
@Override public void onSurfaceCreated(GL10 gl,EGLConfig config){ //关闭抗抖动 gl.dlDisable(GL10.GL_DITHER); //设置系统对透视进行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST); gl.glClearColor(0,0,0,0); //设置阴影平滑模式 gl.glShadeModel(GL10.GL_SMOOTH); //启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEXT); //设置深度测试类型 gl.glDepthFunc(GL10.GL_LEQUAL); }
标签:
原文地址:http://blog.csdn.net/bless2015/article/details/46367437