1、什么是 OpenGL?
OpenGL 是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL 的前身是 SGI 公司为其图形工作站开的 IRIS GL。IRIS GL 是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基础上开发OpenGL 。具体详细的介绍请点击这里 。
2、OpenGL 的发展历程
1992年7月 发布了 OpenGL 1.0 版本,并与微软共同推出 Windows NT 版本的 OpenGL 。
1995年 OpenGL 1.1 版本面市,加入了新功能,并引入了纹理特性等等。
一直到 2009年8月Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。
具体特点及功能、 OpenGL 现状、发展历程、OpenGL 规范、编程入门请点击这里 。
3、OpenGL ES 简介
Android 3D 引擎采用的是OpenGL ES。OpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGL 和 DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是 OpenGL 具有更好的跨平台性。
由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的 OpenGL 系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。
4、Android OpenGL ES 简介5、Android 支持 OpenGL 列表
Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java 标准的OpenGL 包,android.opengl包提供了OpenGL 系统和 Android GUI 系统之间的联系。
- 1、GL
- 2、GL 10
- 3、GL 10 EXT
- 4、GL 11
- 5、GL 11 EXT
- 6、GL 11 ExtensionPack
我们将使用 GL10 这个类开始接触 OpenGL ,探索3D 领域。
6、一步一步实现自己的 Renderer 类
在 Android 中我们使用 GLSurfaceView 来显示 OpenGL 视图,该类位于 android.opengl 包里面。它提供了一个专门用于渲染3D 的接口 Renderer 。接下来我们就来一步步构建自己的 Renderer 类。
- 1、为 Renderer 类赶回命名空间
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->importandroid.opengl.GLSurfaceView.Renderer;
- 2、新建一个类来实现 Renderer 接口,代码如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicclassThreeDGlimplementsRenderer
{
}
- 3、如上代码所写,程序实现了 Renderer 类,则必须重写以下方法
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicvoidonDrawFrame(GL10gl)
{
}
publicvoidonSurfaceChanged(GL10gl,intwidth,intheight)
{}
publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig)
{}
- 4、当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对 OpenGL 做一些初始化工作,例如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
//黑色背景
gl.glClearColor(0,0,0,0);
//设置深度缓存
gl.glClearDepthf(1.0f);
//启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
//所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
//告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
glHint 用于告诉 OpenGL 我们希望进行最好的透视修正,这会轻微地影响性能,但会使得透视图更好看。
glClearColor 设置清除屏幕时所用的颜色,色彩值的范围从 0.0f~1.0f 大小从暗到这的过程。
glShadeModel 用于启用阴影平滑度。阴影平滑通过多边形精细地混合色彩,并对外部光进行平滑。
glDepthFunc 为将深度缓存设想为屏幕后面的层,它不断地对物体进入屏幕内部的深度进行跟踪。
glEnable 启用深度测试。
- 5、当窗口大小发生改变时系统将调用 onSurfaceChange 方法,可以在该方法中设置 OpenGL 场景大小 ,代码如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//设置OpenGL场景的大小
gl.glViewport(0,0,width,height);
- 6、场景画出来了,接下来我们就要实现场景里面的内容,比如:设置它的透视图,让它有种越远的东西看起来越小的感觉,代码如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
//设置视口的大小
gl.glFrustumf(-ratio,ratio,-1,1,1,10);
//选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
//重置模型观察矩阵
gl.glLoadIdentity();
gl.glMatrixMode(GL10.GL_PROJECTION); 指明接下来的代码将影响 projection matrix (投影矩阵),投影矩阵负责为场景增加透视度。
gl.glLoadIdentity(); 此方法相当于我们手机的重置功能,它将所选择的矩阵状态恢复成原始状态,调用glLoadIdentity(); 之后为场景设置透视图。
gl.glMatrixMode(GL10.GL_MODELVIEW);指明任何新的变换将会影响 modelview matrix (模型观察矩阵)。
gl.glFrustumf(-ratio,ratio,-1,1,1,10); 此方法,前面4个参数用于确定窗口的大小,而后面两个参数分别是在场景中所能绘制深度的起点和终点。
- 7、了解了上面两个重写方法的作用和功能之后,第三个方法 onDrawFrame 从字面上理解就知道此方法做绘制图操作的。嗯,没错。在绘图之前,需要将屏幕清除成前面所指定的颜色,清除尝试缓存并且重置场景,然后就可以绘图了, 代码如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
//重置当前的模型观察矩阵
gl.glLoadIdentity();
- 8、Renderer 类在实现了上面的三个重写之后,在程序入口中只需要调用
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->Rendererrender=newThreeDGl(this);
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
GLSurfaceViewgview=newGLSurfaceView(this);
gview.setRenderer(render);
setContentView(gview);
}
即可将我们绘制的图形显示出来。
转自:http://www.cnblogs.com/terryblog/archive/2010/07/09/1774475.html
分享到:
相关推荐
在本篇“Android OpenGL 学习笔记(一)”中,我们将探讨如何在Android平台上使用OpenGL ES进行图形渲染。OpenGL ES是OpenGL的一个轻量级版本,专为嵌入式系统设计,包括移动设备如智能手机和平板电脑。这篇笔记将...
package ljh.opengl;是对OpenglES的一些封装。 package ljh.game;是对一些游戏常用的代码的封装 都没写完! 最近改学IOS了 看看什么时候能补充完。
这本书籍“Android 3D游戏开发技术宝典 OpenGL ES2.0学习”深入浅出地介绍了如何利用OpenGL ES 2.0在Android上构建高性能、视觉震撼的游戏和应用程序。 首先,OpenGL ES 2.0相比其前代1.0,引入了重要的变化,最...
### Android开发学习笔记知识点梳理 #### 一、Android概述与架构 - **定义与发布**:Android是由Google在2007年11月5日宣布的基于Linux平台的开源手机操作系统。它不仅用于智能手机,还广泛应用于平板电脑、可穿戴...
根据提供的文件内容,这是一份详细的Android学习笔记,涵盖了从基础入门到高级特性的各个知识点。以下是从这些内容中提取的知识点: 1. Android入门基础: - 建立第一个App:介绍如何创建Android项目和执行程序。 ...
本篇笔记将深入探讨Cocos2D-X中精灵类的使用及其相关知识点。 首先,我们来了解什么是精灵。在游戏开发中,精灵通常指的是包含单一图像或者动画序列的图形对象。Cocos2D-X中的`cc::Sprite`类就是这样的一个对象,它...
本篇学习笔记主要涵盖了ArcGIS for Android的基础配置和核心组件MapVie的使用。 首先,配置ArcGIS for Android项目需要在`Project`级别的`build.gradle`文件中添加Esri的仓库,确保能获取到所需的库。接着,在`...
Android OpenGL ES学习笔记之绘制一个立方体-附件资源
【Android学习笔记】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑。这个“很好的android学习笔记”包含了作者在学习Android开发过程中积累的宝贵经验,旨在帮助初学者或...
《cocos2d-x学习笔记》 在学习cocos2d-x时,了解其核心组件和工作流程至关重要。AppDelegate是cocos2d-x框架中的一个关键类,它扮演着应用程序入口点的角色,处理应用程序的生命周期事件。让我们深入探讨...
在Android中,可以使用Canvas和OpenGL ES进行绘制,或者利用现有的库如`PageTurner`或`android-page-curl`等来简化开发过程。 1. **视差滚动**:当用户滑动页面时,不同元素以不同的速度移动,模拟纸张被手指推动的...
这篇学习笔记将深入探讨这两个概念及其在实际应用中的使用。 首先,Canvas可以理解为画布,它是Android系统提供的用于在屏幕上绘制图形的对象。在Android中,我们可以通过Canvas来绘制各种形状,如线条、矩形、圆、...
- 学习渲染流程:Cocos2d-x使用OpenGL作为渲染接口,初学者需要学习OpenGL基础以及Cocos2d-x中的渲染流程和优化技巧。 - 掌握事件处理:游戏中的事件处理是交互的核心,需要学习如何响应用户输入和处理游戏中各种...