Android图形---OpenGL(六)

长平狐 发布于 2012/10/16 10:20
阅读 865
收藏 0

本文译自:http://developer.android.com/guide/topics/graphics/opengl.html#compatibility

OpenGL版本和设备兼容性

Android系统从1.0开始就支持OpenGL ES 1.01.1规范,从Android2.2API Level 8)开始,框架支持OpenGL ES 2.0 API规范。OpenGL ES 2.0被大多数Android设备支持,并且推荐新的应用程序用OpenGL来开发。对于支持给定OpenGL ES版本的Android设备的数量的相关信息,请看OpenGL ES版本统计表(http://developer.android.com/about/dashboards/index.html

纹理压缩的支持

纹理压缩能够通过降低对内存的需求和提高对内存的利用效率来显著的提高OpenGL应用的性能。Android框架提供了对ETC1压缩格式的支持,把它作为标准的功能,框架中提供ETC1Util工具类和etc1tool压缩工具(位于Anddroid SDK<sdk>/tools/目录下)。使用纹理压缩的Android示例应用程序,请看CompressedTextureActivity示例代码(http://developer.android.com/tools/samples/index.html)。

大多数的Android设备都支持ETC格式,但是并不保证对所有设备都有效。如果要检查设备是否支持ETC1格式,可以调用ETC1Util.isETC1Supported()方法。

注意:ETC1纹理压缩格式不支持带有alpha通道的纹理。如果应用程序需要带有alpha通道的纹理,应该调查目标设备上其他的纹理压缩格式是否支持alpha通道。

除了ETC1格式之外,Android设备还基于GPU芯片组合OpenGL的实现来支持其他的各种纹理压缩。应该调查目标设备所支持的纹理压缩格式,从而决定应用程序应该支持哪种压缩格式,为了判断给定的设备上支持什么类型的纹理压缩格式,就必须设备并检查OpenGL的扩展名,它标识了设备所支持的纹理压缩格式(以及其他的OpenGL功能)。通常支持的纹理压缩格式如下:

1. ATITCATC--- ATI纹理压缩(ATITCATC)在大部分设备上都是有效的,并且支持针对带有alpha通道和不带有alpha通道的RGB的固定的压缩比率。这种格式可以通过以下几种OpenGL扩展名来表示,如:

GL_AMD_compressed_ATC_texture

GL_ATI_texture_compression_atitc

2. PVRTC---PowerVR纹理压缩(PVRTC)在大部分设备上也是有效的,并且支持带有alpha或不带有alpha通道的2位和4位像素纹理。这种格式通过以下OpenGL扩展名来表示:

GL_IMG_texture_compression_pvrtc

3. S3TC(DXTn/DXTC)---S3纹理压缩(S3TC)有几种格式变种(DXT1DXT5),并且有效范围很窄。这种格式支持带有4位或8alpha通道的RGB纹理。这种格式使用以下OpenGL扩展名来表示:

GL_OES_texture_compression_s3TC

GL_EXT_texture_compression_s3tc

GL_EXT_texture_compression_dxt1

GL_EXT_texture_compression_dxt3

GL_EXT_texture_compression_dxt5

4. 3DC---3DC纹理压缩(3DC)是很少使用的支持带有alpha通道RGB纹理压缩格式。这种格式使用以下OpenGL扩展名来表示:

GL_AMD_compressed_3DC_texture

警告:这些纹理压缩格式不是所有设备都支持的,通过厂家和设备能够确认针对这些格式的支持的变化。

注意:一旦决定应用程序要支持的纹理压缩格式,就要确保在该应用清单的<supports-gl-texture>元素中声明它们。使用这个声明能够启用像Google Play这样的外部服务的过滤功能,以便应用程序只能被安装在支持应用程序所需要的格式的设备上。

判断OpenGL的扩展

不同Android设备所的OpenGL的实现对它所支持的OpenGL ES API进行不同扩展。这些扩展包括纹理压缩,但通常也包含其他的对OpenGL功能集的扩展。

用以下的方法来判断一个特殊的设备上所支持的纹理压缩格式和其他的OpenGL扩展:

1. 在目标设备上运行以下代码来判断设备所支持的纹理压缩格式:

String extensions= javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);

警告:这个调用会因设备不同而有所差异,因此必须在不同目标设备上分别调用这个方法来判断设备所支持的压缩格式。

2. 检查这个方法的输出结果,来判断设备所支持的OpenGL扩展功能。

选择OpenGL API版本

OpenGL ES API 1.0(含1.1的扩展)和2.0为创建3D游戏、可视效果和用户界面都提供了高性能的图形接口。针对OpenGL ES1.0/1.1APIES 2.0的图形编程的差异是显著的,因此在使用其中任何一种API开始开发之前,要充分考虑以下因素:

1. 性能---通常情况下,OpenGL ES 2.0API提供了比OpenGL ES 1.0/1.1API更快的图形性能,但是,性能的差异也会因应用程序所运行的Android设备实现的OpenGL的图形管道的差异而有所不同。

2. 设备的兼容性---开发者应该考虑设备的类型、Android的版本以及OpenGL ES版本等内容对客户的有效性。关于跨设备的OpenGL的兼容性的更多信息,请看OpenGL版本和设备的兼容性一节。

3. 编码的变量性---OpenGL ES 1.0/1.1 API提供了一个固定的功能管道和便利的在ES 2.0 API中所没有的便利的功能函数。对于新手可以更快和更方便的利用OpenGL ES 1.0/1.1 API进行编码。

4. 图形控制---OpenGL ES 2.0 API通过着色器的使用,提供一个完整的可编程的管道,从而提供了更高程度的控制。用更多的直接对图形处理管道的控制,开发者能够创建很多使用ES 1.0/1.1 API很难到达的效果。

因为性能、兼容性、便利性、控制以及其他因素都会影响到API版本选择的决定,因此要基于想要提供最佳的用户体验来选择要使用的OpenGL API 版本。

 


原文链接:http://blog.csdn.net/fireofstar/article/details/7697376
加载中
返回顶部
顶部