web-dev-qa-db-fra.com

Android Compression de texture OpenGL

J'ai besoin d'aide pour trouver des informations (ou un exemple) sur la façon d'utiliser la compression de texture pour Android. J'ai beaucoup de PNG en ce moment et je dois réduire la quantité de mémoire qu'ils occupent. Je regardais la compression PVR mais je n'arrive pas à comprendre comment l'utiliser dans OpenGL.

Est-ce que certains pourraient m'orienter dans la bonne direction ou offrir quelques exemples car je ne trouve rien.

55
Chris

Il existe principalement quatre types de compression de texture pris en charge sur Android:

  • ETC1 (compression de texture Ericsson) . Ce format est pris en charge par tous les téléphones Android. Mais, il ne prend pas en charge un canal alpha, il ne peut donc être utilisé que pour les textures opaques.
  • PVRTC (compression de texture PowerVR) . Pris en charge par les appareils dotés de GPU PowerVR (Nexus S, Kindle fire, etc.).
  • ATITC (compression de texture ATI) . Utilisé dans les appareils avec GPU Adreno de Qualcomm (Nexus One, etc.).
  • S3TC (compression de texture S3) . Cette compression de texture est utilisée dans les appareils intégrés au chipset NVIDIA (Motorola Xoom, etc.)

Informations plus détaillées ici et ici .

En bref, si vos textures n'ont pas d'alpha, vous pouvez utiliser ETC1. S'ils ont l'alpha et que vous souhaitez prendre en charge tous les appareils, vous devez avoir vos textures compressées dans les trois autres types et les charger en fonction de l'appareil.

Comment utiliser:

  1. Compressez vos fichiers png (vous pouvez utiliser un outil comme ETC-Pack , PVRTexTool , ATI Compressonator , Nvidia Texure Tools = selon le type de texture) et ajouter à vos actifs de projet.

  2. Déterminez quelles extensions sont disponibles dans l'appareil, si vous n'utilisez pas 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. Chargez la texture compressée en tant que données brutes.

  4. Utilisez glCompressedTexImage2D au lieu de glTexImage2D:

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

Il s'agit d'un fil ol, donc j'ai pensé le mettre à jour avec les informations disponibles sur http://devtools.ericsson.com/etc ETC2 est obligatoire dans les normes Khronos OpenGL ES 3.0 et OpenGL 4.3 .

5
remi arnaud

Vous ne devez pas utiliser uniquement la compression PVR sur Android, car cela ne fonctionnera pas avec tous les modèles. Pour contourner cela, vous devez soit utiliser uniquement ETC1 (obligatoire sur tous les appareils GLES 2.0), soit avoir des packs de textures distincts pour des modes GPU distincts. Le Android dev guide a une classe d'assistance pour charger le format de compression.

Vous pouvez utiliser etcpack pour effectuer la compression.

Notez que vous n'obtiendrez pas de canal alpha avec ETC1 - vous pouvez faire quelques astuces d'ombrage de fragment pour contourner cela en ayant le canal alpha comme texture distincte.

3
Arne Bergene Fossaa

Je voulais juste souligner que etc1 n'est pas pris en charge par tous les appareils Android, contrairement à ce que gergonzalez a dit

Attention: Le format ETC1 est pris en charge par la plupart des appareils Android, mais il n'est pas garanti d'être disponible. Pour vérifier si le format ETC1 est pris en charge sur un appareil, appelez la méthode ETC1Util.isETC1Supported ().

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

3
ed-