Android OpenGL Texture Compression

Necesito ayuda para encontrar información (o un ejemplo) sobre cómo usar la compresión de textura para Android. Tengo muchos PNG en este momento y necesito reducir la cantidad de memoria que ocupan. Estaba viendo la compresión PVR, pero no puedo entender cómo usar esto en OpenGL.

¿Podrían algunos señalarme en la dirección correcta u ofrecer algunos ejemplos ya que no puedo encontrar nada?

    Hay principalmente cuatro tipos de compresión de textura admitidos en Android:

    • ETC1 (compresión de textura Ericsson) . Este formato es compatible con todos los teléfonos Android. Sin embargo, no es compatible con un canal alfa, por lo que solo se puede usar para texturas opacas.
    • PVRTC (compresión de textura PowerVR) . Compatible con dispositivos con GPU PowerVR (Nexus S, Kindle fire, etc.).
    • ATITC (compresión de textura ATI) . Se utiliza en dispositivos con Adreno GPU de Qualcomm (Nexus One, etc.).
    • S3TC (compresión de textura S3) . Esta compresión de textura se usa en los dispositivos integrados con chipset NVIDIA (Motorola Xoom, etc.)

    Información más detallada aquí y aquí .

    En resumen, si sus texturas no tienen alfa, puede usar ETC1. Si tienen alfa, y desea admitir todos los dispositivos, debe tener sus texturas comprimidas en los otros tres tipos y cargarlas según el dispositivo.

    Cómo utilizar:

    1. Comprima sus archivos png (puede usar una herramienta como ETC-Pack , PVRTexTool , ATI Compressonator , Nvidia Texure Tools según el tipo de textura) y agréguelos a los recursos de su proyecto.

    2. Determine qué extensiones están disponibles en el dispositivo, si no está utilizando 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. Cargue textura comprimida como datos sin formato.

    4. Use glCompressedTexImage2D en lugar de glTexImage2D:

       public void onDrawFrame(GL10 gl) { .... gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width, height, border, imageSize, data); } 

    Este es un viejo hilo, así que pensé en actualizarlo con la información disponible en http://devtools.ericsson.com/etc ETC2 es obligatorio en los estándares de Khronos OpenGL ES 3.0 y OpenGL 4.3.

    No debe usar solo compresión PVR en Android, ya que eso no funcionará en todos los modelos. Para evitarlo, solo debe usar ETC1 (obligatorio en todos los dispositivos GLES 2.0) o tener paquetes de textura separados para modos de GPU separados. La guía de desarrollo de Android tiene una clase de ayuda para cargar el formato de compresión.

    Puede usar etcpack para hacer la compresión.

    Tenga en cuenta que no obtendrá un canal alfa con ETC1; puede hacer algunos trucos de sombreado de fantasía para evitar eso teniendo el canal alfa como una textura separada.

    Solo quería señalar que etc1 no es compatible con todos los dispositivos Android, al contrario de lo que dijo Gergonzalez

    Precaución: el formato ETC1 es compatible con la mayoría de los dispositivos Android, pero no está garantizado que esté disponible. Para verificar si el formato ETC1 es compatible con un dispositivo, llame al método ETC1Util.isETC1Supported ().

    https://developer.android.com/guide/topics/graphics/opengl.html#textures