Texture

Compression Strategies

Compressing textures can significantly improve the performance and load time for graphics applications, since it reduces texture memory and bus bandwidth use. Unlike desktop OpenGL, Vulkan does not provide the necessary infrastructure for the application to compress textures at runtime, so texture data needs to be authored off-line.

Significant texture compression formats supported by Adreno GPUs are:

  • ATC – Proprietary Adreno texture compression format supporting RGB and RGBA component layouts

  • ETC – Standard OpenGL ES 2.0 texture compression format supporting the RGB component layout only

  • ETC2 – Standard OpenGL ES 3.0 texture compression format supporting R, RG, RGB, and RGBA component layouts, as well as sRGB texture data

  • ASTC – Texture compression format supported in OpenGL ES (3.0 and later) and Vulkan that allows the compression use a variable block size, offering remarkably low levels of image degradation given the compression ratios achieved

Note

The following strategy is recommended for selecting a texture compression format:

  1. Use ASTC compression if it is available.

  2. Otherwise, use ETC2 compression if available.

  3. Otherwise, select the compression format as follows:
    1. ATC if using alpha

    2. ETC if not using alpha

ASTC is a newer format and may not be supported or optimized on all content creation pipelines. Also, the sRGB formats for ASTC are more efficiently handled on Adreno hardware than the RGBA formats.

The following are popular methods for converting textures to Adreno hardware:

  • On-device conversion

  • Prepackaging

  • Downloading

On-device conversion involves a time-consuming one-time conversion of texture assets that occurs when the game starts up. Prepackaging the correct textures results in the most optimized solution but requires alternative versions of the APK for each GPU. Downloading requires GPU detection and an internet connection but allows for even more control on the exact texture format for each GPU. In either case, the first step is to create the compressed textures.

Texture data can be compressed to any of these texture compression formats using the Adreno Texture Compression and Visualization Tool or Adreno Texture Converter Tool, both included in the Adreno SDK for OpenGL. There is a Compressed Texture tutorial in the SDK, which presents how to use compressed textures in OpenGL ES applications.

The effectiveness of these compression formats is described below, consisting of one diffuse and one object-space normal RGB texture, compressed using the Adreno Texture Tool. The figures show the original textures and the compressed versions using each of the compression formats. For each example, there is a difference image showing the absolute difference between the original and the compressed version.

Diffuse texture test

The diffuse texture used for this test is shown below:

Diffuse Test

ATC Compression

Diffuse Test ATC Diffuse Test ATC Diff

ETC1 Compression

Diffuse Test ETC1 Diffuse Test ETC1 Diff

ETC2 Compression

Diffuse Test ETC2 Diffuse Test ETC2 Diff

Normal texture test

Texture data can be compressed to any of these texture compression formats using the Adreno Texture Tool (QCompress.exe) included in the Adreno SDK for Vulkan. There is a Textures tutorial in the SDK, which demonstrates how to use compressed textures in Vulkan applications. The normal texture used for this test is shown below.

Normal Test

ATC Compression

Normal Test ATC Normal Test ATC Diff

ETC1 Compression

Normal Test ETC1 Normal Test ETC1 Diff

ETC2 Compression

Normal Test ETC2 Normal Test ETC2 Diff