55 votes

Compression de texture Android OpenGL

J'ai besoin d'aide pour trouver des informations (ou un exemple) sur l'utilisation de la compression de texture pour Android. J'ai beaucoup de PNG en ce moment et j'ai besoin de réduire la quantité de mémoire utilisée. Je cherchais la compression PVR mais je n'arrive pas à comprendre comment l'utiliser dans OpenGL

Est-ce que certains pourraient me diriger dans la bonne direction ou donner des exemples car je ne trouve rien

Merci

84voto

gergonzalez Points 1485

Il y a principalement quatre textures types de compression pris en charge sur Android:

  • ETC1 (Ericcson compression de texture). Ce format est pris en charge par tous les téléphones Android. Mais, Il ne prend pas en charge un canal alpha, ne peut donc être utilisé pour opaque textures.
  • PVRTC (PowerVR compression de texture). Pris en charge par les dispositifs de Gpu PowerVR (Nexus S, Kindle fire...).
  • ATITC (ATI compression de texture).Utilisés dans les appareils avec GPU Adreno de Qualcomm (Nexus One...).
  • S3TC (S3 compression de texture). Cette texture de compression est utilisé dans la NVIDIA chipset integrated devices (périphériques intégrés (Motorola Xoom...)

Des informations plus détaillées ici et ici.

En bref, si vos textures n'ont pas l'alpha, vous pouvez utiliser ETC1. Si fait, et vous voulez soutenir tous les appareils, vous devez avoir votre textures compressées dans les trois autres types et de les charger en fonction de l'appareil.

Comment l'utiliser:

  1. Compresser vos fichiers png (Vous pouvez utiliser un outil comme ETC-Pack, PVRTexTool, ATI Compressonator, Nvidia Texure Outils en fonction du type de texture) et les ajouter à l'actif du projet.

  2. Déterminer les extensions sont disponibles dans l'appareil, si vous ne l'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. Chargement de texture compressée en tant que données brutes.

  4. Utilisation glCompressedTexImage2D au lieu de glTexImage2D:

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

5voto

remi arnaud Points 21

C’est un vieux fil, j’ai donc pensé que je mettrais à jour les informations disponibles sur http://devtools.ericsson.com/etc ETC2 est obligatoire dans les normes Khronos OpenGL ES 3.0 et OpenGL 4.3.

3voto

Edward Corlew Points 74

Je voulais simplement faire remarquer etc1 n'est pas pris en charge par tous les appareils android, contrairement à ce que gergonzalez dit

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

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

3voto

Vous ne devez pas utiliser juste PVR compression sur Android, car cela ne marchera pas avec tous les modèles. Pour obtenir autour de ce que vous devez soit utiliser uniquement ETC1 (mandaté sur tous GLES 2.0) ou de séparer les packs de texture pour séparer les GPU modes. L'android dev guide a une classe d'aide pour charger le format de compression.

Vous pouvez utiliser etcpack de faire de la compression.

Notez que vous ne serez pas obtenir un canal alpha avec ETC1 - vous pouvez faire un peu de fantaisie fragment de l'ombrage des astuces pour contourner en avoir le canal alpha en tant que distincte de la texture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X