引自:http://blog.csdn.net/hgl868/article/details/6971624

1.    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绘图的要求。

2.    Android OpenGL ES简介

Android系统使用OpenGL的标准接口来支持3D图形功能,android 3D图形系统也分为java框架和本地代码两部分。本地代码主要实现的OpenGL接口的库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,android.opengl包提供了OpenGL系统和Android GUI系统之间的联系。

Android的本地代码位于frameworks/base/opengl下,JNI代码位于frameworks/base/core/com_google_android_gles_jni_GLImpl.cpp和frameworks/base/core/com_google_android_gles_jni_EGLImpl.cpp,java类位于opengl/java/javax/microedition/khronos下

3.    OpenGL的本地代码分析

3.1 OpenGL ES测试代码

frameworks/base/opengl/tests下有OpenGL的本地测试代码。包括angeles、fillrate等14个测试代码,这些代码都可以通过终端进行本地调用测试(模拟器中使用adb shell)。在本文中,主要使用了tritex这个测试用例。

在tests文件夹中执行mm,打印出以下信息

Install: out/target/product/generic/system/bin/angeles

Install: out/target/product/generic/system/bin/test-opengl-tritex

由以上信息可知,测试用例被安装在了out/target/product/generic/system/bin/目录下,将之拷贝到nfs文件系统中,以便测试。我把这些测试用例都单独放在android的根文件系统的gltest文件夹中了。

3.2  OpenGL ES的编译

编译libagl下的源码生成Install: out/target/product/generic/system/lib/egl/libGLES_android.so

编译libs下的生成了

Install: out/target/product/generic/system/lib/libGLESv2.so

Install: out/target/product/generic/system/lib/libGLESv1_CM.so

Install: out/target/product/generic/system/lib/libEGL.so

3.3 使用OpenGL ES画图必经的步骤

1、获取Display,Display代表显示器。

函数原型:

EGLDisplay eglGetDisplay(NativeDisplayType display);

display参数是native系统的窗口显示ID值,一般为 EGL_DEFAULT_DISPLAY 。该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。

2、初始化egl库。

函数原型:

EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);

其中dpy应该是一个有效的 EGLDisplay 。函数返回时,major和minor将被赋予当前EGL版本号。

3、选择一个合适的EGL Configuration FrameBuffer,实际指的是FrameBuffer的参数

函数原型:

EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,EGLConfig *configs, EGLint config_size,

EGLint *num_config);

参数attrib_list:指定了选择配置时需要参照的属性。

参数configs:    将返回一个按照attrib_list排序的平台有效的所有EGL framebuffer配置列表。

参数config_size:指定了可以返回到configs的总配置个数。

参数num_config: 返回了实际匹配的配置总数。

4、创建一个可实际显示的EGLSurface,实际上就是一个FrameBuffer

函数原型:

EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,

NativeWindowType win,

const EGLint *attrib_list);

5、创建Context

函数原型:

EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,

EGLContext share_context,

const EGLint *attrib_list);

6、绑定Display、Surface、Context

函数原型:

EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,

EGLSurface read, EGLContext ctx);

3.4 OpenGL ES 执行过程

运行android操作系统之后,输入logcat命令,然后执行gltest中的test-opengl-tritex,屏幕上打印了以下信息

D/libEGL  ( 1962): egl.cfg not found, using default config

D/libEGL  ( 1962): loaded /system/lib/egl/libGLES_android.so

可以看出,在执行OpenGL调用的过程中,会自动加载libGLES_android.so动态链接库。后面将会通过分析和修改源码的方式,了解OpenGL ES系统的调用过程。

通过3.3中的说明,我们在tritex测试程序中插入一些调试信息,查看OpenGL ES的调用过程。

在调用eglGetDisplay之前会执行early_egl_init函数,这是一个静态的函数。

在eglGetDisplay中会去初始化驱动,最终调用到egl_init_drivers_locked函数中。这个函数的主要内容如下

Android OpenGL ES .介绍的更多相关文章

  1. Android OpenGL ES(一)OpenGL ES介绍

    在学习Android OpenGL ES开发之前,你必须具备Java 语言开发经验和一些Android开发的基本知识,但并不需要有图形开发的经验,本教程也会涉及到一些基本的线性几何知识,如矢量,矩阵运 ...

  2. Android OpenGL ES(十三)通用的矩阵变换指令 .

    Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的.这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) An ...

  3. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .

    OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形.但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三 ...

  4. Android OpenGL ES(八)绘制点Point ..

    上一篇介绍了OpenGL ES能够绘制的几种基本几何图形:点,线,三角形.将分别介绍这几种基本几何图形的例子.为方便起见,暂时在同一平面上绘制这些几何图形,在后面介绍完OpenGL ES的坐标系统和坐 ...

  5. Android OpenGL ES(七)基本几何图形定义 .

    在前面Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架 我们创建了示例程序的基本框架,并提供了一个“Hello World”示例,将屏幕显示为红色. 本例介绍Ope ...

  6. Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .

    有了前面关于Android OpenGL ES的介绍,可以开始创建示例程序OpenGLDemos. 使用Eclipse 创建一个Android项目 Project Name: OpenGLDemos ...

  7. Android OpenGL ES 开发教程 从入门到精通

    感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...

  8. [工作记录] Android OpenGL ES: non-square texture - continue

    previous: [工作记录] Android OpenGL ES 2.0: square texture not supported on some device recently I found ...

  9. Android OpenGL ES(五)GLSurfaceView .

    Android OpenGL ES 相关的包主要定义在 javax.microedition.khronos.opengles    GL 绘图指令 javax.microedition.khrono ...

随机推荐

  1. 关于通过addClass与removeClass用jquery控制有良好兼容的CSS3样式

    hi:)好久不见~最近被jquery的animate对某些CSS3特性不兼容搞的头晕眼花,果断百度,阅读了一些高手的博客后突然发现平常很少用到的addClass和removeClass属性居然还可以这 ...

  2. 去掉svn与文件之间 的关联

    今天在检出文件的时候,没注意检出目录 ,居然直接检出到D盘里了.然后就看到D盘上有个大大的绿勾,看起来很不舒服,想去掉. 自己看看小乌龟里好像没这功能,于是百度,一大堆都是要改和注册相关的东西,照着做 ...

  3. Adobe Acrobat Pro 9破解

    (转载,Window8.1/64bit系统亲测可用) 1.删除C:\Program Files\Common Files\Adobe\Adobe PCD\cache\cache.db和C:\Docum ...

  4. 从零开始学Axure原型设计(入门篇)

    如果说Sketch是最美.最简洁的设计软件,那么Axure就是最强大的原型制作软件.Axure不仅能制作静态的视觉稿.页面,还能添加交互动作,是进行原型设计的最佳软件之一.虽然Axure的学习曲线比较 ...

  5. #include 和 #pragma comment 的相对路径起点

    #include 是以当前文件所在路径为当前目录 #pragma comment 是以当前工程所在路径为当前目录 #include "../../../../ThirdParty/Inclu ...

  6. io外挂

    c++里最快的io方式是什么呢? 详见这里. 同时给出一个比较常用的方式,就是用fread.然后自己解析文本,而不是用cin或者scanf,见这里: //fast io test #include & ...

  7. uitableview 关于键盘挡住输入框解决方法

    // // AboutKeyBoardEventViewController.m // QueryBussinessInfo // // Created by mac on 16/8/23. // C ...

  8. 灰色关联度Matlab代码

    load x.txt %把原始数据存放在纯文本文件x.txt中,其中把数据的"替换替换成. for i=1:40x(i,:)=x(i,:)/x(i,1); %标准化数据end data=x; ...

  9. 安装cocoapods遇到的一些问题

    其实可以直接到https://github.com/CocoaPods/Specs上把所需的文件夹下载下来 解压后命名为master放在本地的 ~/.cocoapods/repos  下面就行 但是使 ...

  10. iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置

    转载自:http://www.cnblogs.com/tmf-4838/p/5361271.html #import "ViewController.h" #import < ...