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.
Il existe principalement quatre types de compression de texture pris en charge sur Android:
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:
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.
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.
}
}
Chargez la texture compressée en tant que données brutes.
Utilisez glCompressedTexImage2D au lieu de glTexImage2D:
public void onDrawFrame(GL10 gl) {
....
gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width,
height, border, imageSize, data);
}
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 .
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.
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