1 概述
本系列的相关文章将会介绍关于Qualcomm Adreno GPU Android 平台的OpenGL ES应用的开发以及优化。OpenGL ES是OpenGL 2D和3D图形库的一个子集,主要是为受到处理器能力、内存以及电源功耗的嵌入式系统而设计。这篇文章适合对3D图像API(例如OpenGL ES等)有了解的应用开发者。
2 Adreno GPU
Adreno GPU作为Qualcomm®SnapdragonTM一体化设计的一部分内置处理器,加速复杂几何形状的渲染使得处理器能够满足游戏的各级性能要求。Adreno GPU专为移动API和移动设备而构建,其在性能和高效省电方面有着很多的特性。最初的Adreno 130变体仅支持OpenGL ES 1.1。 Adreno 2xx系列及以后版本支持OpenGL ES 2.0。 Adreno 3xx系列增加了对OpenGL ES 3.0和OpenCL的支持。 Adreno 4x增加了对OpenGL ES 3.1和AEP的支持。
2.1 Adreno APIs
Adreno 4x支持Khronos标准API,包括 :
- OpenGL ES 1.x (固定功能渲染管线)
- OpenGL ES 2.x (可编程渲染管线)
- OpenGL ES 3.0
- EGL
- OpenCL 1.1e
Adreno 4xx 还支持其他特性:
- OpenGL ES 3.1 (OpenGL ES最新的API)
- AEP
- OpenCL 1.2 full
除了上述的功能支持外,还支持对OpenGL ES APIs的扩展。
2.2 OpenGL ES
OpenGL ES是嵌入式系统中的一个跨平台的2D和3D图形引擎库,可以在软件和图像加速之间创建一个灵活的接口。
2.2.1 OpenGL ES Versions
下面部分概述了可用的OpenGL ES的不同版本以及它们和OpenGL之前的关系。并且还详细的描述了它们和开发者可以优化部分之间的主要功能手段。
- OpenGL ES 1.x
1.x是相对于OpenGL 1.5定义并且是为了固定功能硬件而设计的,同时也强调硬件加速方面的API。1.x提供了一些增强功能,例如提高图像的渲染质量、在节省内存带宽节省电量的情况下提升优化设备的性能。更多APIs的详细说明可以参阅 https://www.khronos.org/opengles/1_X/ 。 - OpenGL ES 2.x
2.x是基于OpenGL 2.0而定义,2.x的设计支持可编程硬件并且重心位于可编程的3D图像管线上,同时提供创建shader和program对象的能力,也就是2.x中提到的vertex和fragment着色器。2.x不支持1.x的固定功能转换和片段管线。更多的信息可参阅网址 https://www.khronos.org/api/opengles/2_X 。 - OpenGL ES 3.x
3.x 向下兼容2.x和1.x,它通过增强渲染管线来支持高级视觉效果的性能加速,以及增强纹理等功能,同时也是用了一个新版本的OpenGL ES Shading Language。更多的信息可以访问 https://www.khronos.org/api/opengles/3_X 。
2.3 关于Android
Android 是Google 公司开发的一款基于Linux内核的移动操作系统。
2.3.1 OpenGL ES在Android平台的支持
Android支持OpenGL ES API的一些版本,如下:
- OpenGL ES 1.0 and 1.1
在Android 1.0 以及更高的版本上支持 - OpenGL ES 2.0
在Android 2.2(API level 8)以及更高的版本上支持 - OpenGL ES 3.0
在Android 4.3(API level 18)以及更高的版本上支持 - OpenGL ES 3.1
在Android 5.0之后开始支持
2.3.2 Adreno GPU上的Android和OpenGL ES
Adreno GPU版本支持不同级别的OpenGL ES。不同版本的OpenGL ES,在Android系统上都有一个最低版本的要求,例如想要在Android平台上使用OpenGL ES 3.0,最低版本要求是Adreno 3xx和Android 4.3。
Adreno version | OpenGL ES version supported | Android version |
Adreno 1xx | 1.1 | Android 1.0 |
Adreno 2xx | 2.0 | Android 2.2 |
Adreno 3xx | 3.0 | Android 4.3 |
Adreno 4xx | 3.1 | Android 5.0 |
3 Adreo GPU 的 OpenGL ES 2.0
在开发OpenGL ES版本之前,有必要搭建好合适的开发环境。例如Adreno SDK、Android developer tools、Android NDK、Ant、Java development kit、Adreno SDK emulator等。其中Adreno SDK的搭建环境可以参考https://developer.qualcomm.com/download/。
OpenGL ES 1.1和OpengGL ES2.0的规范中,都定义了每种实现必须支持的最低标准。但是,在OpenGL ES规范中,对这些应该支持的性能的实现没有限制的那么死板。在OpenGL ES的规范中,有很多种方法可以扩展这些能力范围。
无论你选择构建OpenGL ES1.1还是OpengGL ES2.0的应用程序,你的应用程序应该做的第一件事,就是确定在目前的实现下所具备的准确的能力。为了做这些,你的应用程序需要设定当前上下文,然后调用一个或者更多的OpenGL ES的函数来取回实现的某些特定能力。在创建之后,上下文所具备的能力不能够被改变。一旦你的应用程序具备了这些能力,那么就可以根据这些能力适当的修剪绘制的代码。例如,根据执行提供的纹理单元数量,你可能会单次执行计算,执行多遍,或选择一个简单的算法。一个常用的方式,就是在你的应用程序中,为每一个渲染方式都设计一个类,并且这些类都拥有一个通用的父类。你运行时,你会根据上下文的能力实例化不同的类。
在OpenGL ES规范中定义了实现依赖值,这些值来定义OpenGL ES实现所具有的能力极限范围。例如,纹理的最大尺寸和纹理单元的个数是经常用到的实现依赖值,一个应用程序经常会确认这些值的。IOS设备支持PowerBR MBX图像硬件,最大的纹理尺寸是1024x1024,而PowerVR SGX软件支持的最大纹理尺寸是2048x2048。这两个尺寸都超过了64x64,这个是OpenGL ES规范中的最小尺寸要求。如果你的应用程序要超过这个最小尺寸的要求,那么就应该查询硬件设备是否支持你需要的尺寸。否则,你就需要导入一个更小的纹理或者使用一个不同的渲染策略。规范提供了这些限制的很完善的清单,但是在OpenGL ES应用程序中只有一部分会用到。表 3-1 列出了OpenGL ES1.1和OpenGL ES2.0应用程序应该检测的值。
在OpenGL ES2.0的应用程序中,你的应用程序首先要读取放置在着色器上面的各种限制。所有的硬件设备都支持一个有限的属性值,传递给顶点和片段着色器。当你的应用程序实现时,超过了这些极限值,一个OpenGL ES 2.0的实现不会给你提供一个软件回退。所以你的应用程序要么就在规定的最小值上实现,要么就针对极下面限值,从而选择何时的值来使用着色器。
- 顶点属性的最大数量 GL_MAX_VERTEX_ATTRIBS
- 统一顶点向量的最大数量 GL_MAX_VERTEX_UNIFORM_VECTORS
- 统一片段向量的最大数量 GL_MAX_FRAGMENT_UNIFORM_VECTORS
- 可变向量的最大数量 GL_MAX_VARYING_VECTORS
- 在一个顶点着色器上纹理单元的最大数量 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS
- 在一个片段着色器上纹理单元的最大数量 GL_MAX_TEXTURE_IMAGE_UNITS