赞
踩
注:文章部分引用自http://blog.csdn.net/andyhuabing/article/details/7176049
最近需要移植一个硬件的GPU 3D功能到Android系统里,哪么学习Android与OpenGLES的关系哪是必需的了,首先就是如何加载软/硬OpenGLES的库。
1:首先在没有加进硬件3D代码之前,Android默认使用的是软件OpenGLES API的库,也就是libGLES_android 。其中Android内部依赖以下三个库去加载管理OpenGLES API。
1):libEGL.so
EGL是用来管理绘图表面的(Drawing surfaces),并且提供了如下的机制
(1)与本地窗口系统进行通信
(2)查找绘图表面可用的类型和配置信息
(3)创建绘图表面
(4)同步OpenGL ES 2.0和其他的渲染API(Open VG、本地窗口系统的绘图命令等)
(5)管理渲染资源,比如材质
EGL 和 OpenGL ES API的联系
(1)通过解析OpenGL ES API函数库 libGLES_android.so来获取函数指针,进行调用。
(2)通过线程局部存储机制进行联系。
其实Android自身的libEGL并非真正的EGL API,libEGL具有加载管理OpenGLES库,并提供真正EGL库 API的封装。
例如libGLES_android.so里就有EGL API的真正实现:frameworks/base/opengl/libagl/egl.cpp。
而硬件3D的EGL API的实现通常单独编译成一个库,例如GPU Vivante厂商的EGL API库一般就命名为libEGL_VIVANTE.so 。
2):libGLESv1_CM.so,libGLESv2.soz
这两个库都是对OpenGLES API的封装,其中libGLESv1_CM.so是对OpenGLES1.0库的封装,libGLESV2.so是对OpenGLES2.0库的封装。这两个库封装的对像是OpenGLES API的实现,所以用软件OpenGLES的话,部分API的实现可以在libGLES_android.so中实现,当然在frameworks/base/opengl/libagl/目录下会有原码。而硬件OpenGLES的话,API的实现一般会编译成库,例如GPU Vivante厂商的OpenGLES1.0的API库一般就命名为libGLESv1_CM_VIVANTE.so,OpenGLES2.0的API库一般命名为libGLESv2_VIVANTE.so 。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。