Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android OpenGL Texture Compression

I need some help finding information (or an example) of how to use texture compression for Android. I have a lot of PNG's right now and I need to reduce the amount of memory they take up. I was looking at PVR compression but I can't figure out how to use this within OpenGL.

Could some point me in the right direction or offer some examples as I cannot find anything.

like image 451
Chris Avatar asked Feb 05 '12 11:02

Chris


People also ask

Does texture compression improve performance?

The Adaptive Scalable Texture Compression (ASTC) format offers advantages, such as improved rendering performance, faster load times, a smaller in-memory footprint, better battery life, and improved visual quality.

Does texture compression affect performance?

Texture size should not have any effect on the performance. Texture compression can have a positive impact - the less space a block occupies in memory, the more blocks can be cached at the same time.

What does texture compression do?

Texture compression is a specialized form of image compression designed for storing texture maps in 3D computer graphics rendering systems. Unlike conventional image compression algorithms, texture compression algorithms are optimized for random access.


2 Answers

There are mainly four texture compression types supported on Android:

  • ETC1 (Ericsson texture compression). This format is supported by all Android phones. But, it doesn't support an alpha channel, so can only be used for opaque textures.
  • PVRTC (PowerVR texture compression). Supported by devices with PowerVR GPUs (Nexus S, Kindle fire, etc.).
  • ATITC (ATI texture compression). Used in devices with Adreno GPU from Qualcomm (Nexus One, etc.).
  • S3TC (S3 texture compression). This texture compression is used in the NVIDIA chipset integrated devices (Motorola Xoom, etc.)

More detailed information here and here.

In short, if your textures don't have alpha, you can use ETC1. If they do have alpha, and you want to support all devices, you must have your textures compressed in the other three types and load them according to the device.

How to use:

  1. Compress your png files (You can use a tool like ETC-Pack, PVRTexTool, ATI Compressonator, Nvidia Texure Tools according to the type of texture) and add to your project assets.

  2. Determine which extensions are available in the device, if you're not using ETC1:

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {       String s = gl.glGetString(GL10.GL_EXTENSIONS);       if (s.contains("GL_IMG_texture_compression_pvrtc")){           //Use PVR compressed textures               }else if (s.contains("GL_AMD_compressed_ATC_texture") ||               s.contains("GL_ATI_texture_compression_atitc")){           //Load ATI Textures                 }else if (s.contains("GL_OES_texture_compression_S3TC") ||                 s.contains("GL_EXT_texture_compression_s3tc")){          //Use DTX Textures      }else{          //Handle no texture compression founded.                     }  }            
  3. Load compressed texture as raw data.

  4. Use glCompressedTexImage2D instead of glTexImage2D:

    public void onDrawFrame(GL10 gl) {     ....     gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width,                               height, border, imageSize, data);  } 
like image 136
gergonzalez Avatar answered Oct 02 '22 09:10

gergonzalez


This is an ol thread, so I thought I'd update it with the information available on http://devtools.ericsson.com/etc ETC2 is mandatory in the Khronos standards OpenGL ES 3.0 and OpenGL 4.3.

like image 45
remi arnaud Avatar answered Oct 02 '22 09:10

remi arnaud