优化OpenGL ES 应用 (4)
9.3 纹理压缩策略
压缩纹理可以显着改善图形应用程序的性能和加载时间,因为它可以减少纹理内存和总线带宽的使用。 与桌面OpenGL不同,OpenGL ES不提供应用程序在运行时压缩纹理的必要基础结构,因此纹理数据需要脱机编写。
Adreno GPU支持的重要纹理压缩格式为:
- ATC –支持RGB和RGBA的专有Adreno纹理压缩格式组件布局
- ETC –标准OpenGL ES 2.0纹理压缩格式,仅支持RGB组件布局
- ETC2 –支持R,RG,RGB和RGBA组件布局以及sRGB纹理数据的标准OpenGL ES 3.0纹理压缩格式
- ASTC – AEP中引入的纹理压缩格式,在达到压缩率的情况下,图像退化的程度非常低
QTI建议以下策略选择纹理压缩格式:
- 使用ASTC压缩(如果可用)。
- 否则,请使用ETC2压缩(如果可用)。
- 否则,请选择压缩格式,如下所示:
a. 如果使用Alpha,则为ATC
b. 如果不使用Alpha,则为ETC
ASTC是较新的格式,并非在所有内容创建管道上都受支持或优化。 同样,与RGBA格式相比,在Adreno硬件上可以更有效地处理ASTC的sRGB格式。
以下是将纹理转换为Adreno硬件的常用方法:
- 设备上转换
- 预包装
- 下载
设备上转换涉及在游戏启动时进行的耗时的一次纹理资产转换。 预包装正确的纹理可以得到最优化的解决方案,但每个GPU都需要APK的替代版本。 下载需要GPU检测和互联网连接,但允许对每个GPU的确切纹理格式进行更多控制。 无论哪种情况,第一步都是创建压缩纹理。
可以使用Adreno SDK附带的Adreno纹理压缩和可视化工具或Adreno纹理转换器工具将纹理数据压缩为这些纹理压缩格式中的任何一种。 SDK中有一个“压缩纹理”教程,该教程介绍了如何在OpenGL ES应用程序中使用压缩纹理。
这些压缩格式的效果遍及图9-2至图9-15,包括使用Adreno纹理工具压缩的一种漫反射和一种对象空间普通RGB纹理。 这些图显示了原始纹理和使用每种压缩格式的压缩版本。 对于每个示例,都有一个差异图像显示原始版本和压缩版本之间的绝对差异。
9.3.1 漫反射纹理测试
此测试使用的漫反射纹理如图9-2所示。
9.3.1.1 ATC压缩
图9-3和图9-4显示了GL_ATC_RGB_AMD内部格式的使用。
9.3.1.2 ETC1压缩
图9-5和图9-6显示了GL_ETC1_RGB8_OES内部格式的使用。
9.3.1.3 ETC2压缩
图9-7和图9-8显示了GL_COMPRESSED_RGB8_ETC2内部格式的使用。