21 octobre 2025

Compression de textures KTX2

Les textures sont omniprésentes dans les applications graphiques modernes. Elles apportent les informations de couleur et de matériau à nos modèles.

Plus la résolution d’une texture est élevée, plus elle peut contenir de détails. Aujourd’hui, les caméras haute résolution deviennent plus accessibles et abordables. Mais cela a un coût : la consommation de mémoire.

Il existe des formats d’image compressés comme JPEG et PNG, qui réduisent l’espace occupé par les images stockées sur disque. Ces formats sont également utiles pour les applications web, car ils réduisent la quantité de données à transférer sur le réseau, et donc les temps de chargement des pages. Cependant, des formats comme JPEG ne peuvent pas être interprétés par la carte graphique (GPU) : ils sont conçus uniquement pour compresser des images, pas pour le rendu. Une image JPEG doit être décompressée avant d’être envoyée au GPU pour le rendu.

Voici une image de 256×256.

Créée avec GIMP

Compressée en JPEG haute qualité, elle pèse 53,5 Ko.

Une fois l’image décompressée en RGBA8 pour être utilisée par le GPU, elle occupe 256 Ko. Soit environ 5 fois plus !

Il s’agit d’une très petite image, mais à titre d’exemple, une image 4K (très courante aujourd’hui) occuperait 64 Mo. Les grandes applications comportent de nombreuses ressources, dont des textures : cela peut vite s’accumuler et épuiser toute la mémoire du GPU (VRAM), en particulier sur les appareils d’entrée de gamme comme les smartphones, les tablettes et les casques VR.

Les formats de compression de textures ont été inventés pour permettre de compresser les images dans le GPU. Ces formats sont conçus pour s’adapter à l’architecture des GPU afin d’obtenir des performances optimales. Cela se traduit non seulement par une utilisation réduite de la VRAM, mais aussi par :

  • Des temps de chargement plus courts, car la quantité de données à transférer au GPU est moindre.
  • De meilleures fréquences d’images, car les besoins en bande passante de transfert interne sont réduits.

Différents fabricants de GPU, en collaboration avec les principaux acteurs concernés, ont créé différents formats de compression de textures. Parmi ces formats, citons :

  • La famille de formats BC (également appelée S3TC), comme BC1, BC3, BC6H, BC7 (entre autres). Ces formats sont exclusifs aux plateformes de bureau.
  • La famille ETC (Ericsson Texture Compression), composée d’ETC1, ETC2, ETC2_EAC et EAC. Ces formats ont principalement été adoptés par OpenGL et sont utilisés sur les plateformes Android et WebGL.
  • PVRTC est une famille de formats exclusive aux puces PowerVR. Elle était importante car c’était le seul format pris en charge sur iOS. Elle devient aujourd’hui obsolète, Apple adoptant désormais ASTC sur tous ses appareils.
  • ASTC est aujourd’hui le format de compression de textures le plus avancé. C’est un standard développé par le groupe Khronos, devenu le format de facto pour les appareils mobiles.

Comme vous pouvez l’imaginer, la multitude de formats de compression de textures peut être un vrai casse-tête pour les développeurs d’applications soucieux d’obtenir de bonnes performances sur plusieurs plateformes.

Le groupe Khronos a tenté de résoudre ce problème de fragmentation avec le format conteneur KTX2 et les schémas de supercompression. Nous les examinerons plus en détail dans les sections suivantes.

KTX1

Avant KTX2, comme vous l’avez sans doute deviné, il y avait KTX1.

KTX1 était un format conteneur d’images très simple ­­­­­— c’est-à-dire un format qui contient des images, lesquelles peuvent être dans différents formats. Il pouvait contenir n’importe lequel des formats de textures compressées mentionnés ci-dessus, ainsi que des images RGBA brutes. C’est simple, et ça fonctionne.

Le problème était que, pour prendre en charge de nombreuses plateformes, le conteneur KTX1 devait inclure les images dans les formats spécifiques à chaque plateforme. Cela peut être difficile à maintenir et implique de stocker la même information dans chaque format (les fichiers deviennent plus volumineux).

KTX2

KTX2 vise à réduire encore davantage la fragmentation grâce aux formats transcodables et aux schémas de supercompression.

En plus des formats d’image pris en charge par KTX1, KTX2 ajoute deux formats transcodables : Universal ASTC (UASTC) et ETC1S. Ces formats sont conçus pour être convertis vers les formats de compression de textures propres à chaque plateforme. La conversion de ces formats dits transcodables vers les formats de compression de textures est extrêmement rapide : c’est donc un processus qui peut facilement être réalisé à l’exécution (on parle de transcodage).

De plus, KTX2 prend en charge des schémas de supercompression. Il s’agit d’une technique qui compresse davantage les formats transcodables sur disque. Grâce à ces techniques, on obtient des fichiers KTX2 d’une taille comparable au JPEG, voire parfois inférieure.

[image de https://www.khronos.org/ktx/]

 

Comment convertir des images en KTX

Pour convertir vos images en KTX, vous pouvez utiliser les outils en ligne de commande officiels KTX-Software.

Vous pouvez compiler les outils en ligne de commande à partir des sources, mais le plus simple est de télécharger l’installateur depuis la section Releases.

Pendant l’installation, assurez-vous que la case « Command line tools » est cochée.

Dans le dossier d’installation, vous trouverez l’outil dont vous avez besoin : toktx.exe.

Commande de base :

toktx.exe –encode uastc –zcmp 15 –genmipmap output.ktx input.jpg

 

–zcmp : définit le niveau de compression sur disque.

–genmipmap : toute la chaîne de mipmaps sera générée et stockée dans le fichier KTX. C’est recommandé, car générer la chaîne de mipmaps de textures compressées est coûteux : il vaut mieux éviter de le faire à l’exécution.

Une autre option intéressante est –uastc_quality, qui permet d’ajuster finement le compromis entre qualité et vitesse de compression.

toktx.exe –encode uastc –zcmp 15 –genmipmap –uastc_quality 3 output.ktx input.jpg

 

toktx propose de nombreuses options que nous vous recommandons vivement de consulter :

toktx.exe –help

 

Benchmarks

À titre d’exemple simple, nous utilisons une sphère avec un matériau PBR.

Nous avons créé deux matériaux identiques, à ceci près que l’un utilise des images JPG et l’autre des images KTX.

Comme vous pouvez le constater, l’utilisation de KTX réduit considérablement la consommation de VRAM. Les 4 images occupent au total 128 Mo de VRAM avec JPG, contre 32 Mo avec KTX. La qualité de l’image finale est similaire et vous ne remarquerez pas la différence.

En outre, il semble que pour la plupart des images, KTX occupe moins d’espace disque que JPG, même si ce n’est pas toujours le cas.

Pour ce test, nous avons converti les images JPG en KTX à l’aide de l’outil en ligne de commande officiel « toktx ». Trouver le meilleur jeu de paramètres pour cet outil relève de l’art, car il faut jouer sur des compromis. Essayez de trouver les paramètres les plus adaptés aux images de votre application, en tenant compte des exigences de qualité et de performances. Par exemple, les normal maps exigent généralement plus de précision que les color maps.

Voici les paramètres que nous avons utilisés pour l’exemple précédent :

color :

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf srgb –target_type RGB –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_color.ktx .\Jpg\Bricks_color.jpg

 

normals :

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type RGB –normalize –uastc_quality 3 –uastc_rdo_l 0.5 –zcmp 20 .\Ktx\Bricks_normals.ktx .\Jpg\Bricks_normals.jpg

 

pbr :

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type RG –uastc_quality 3 –uastc_rdo_l 1 –zcmp 20 .\Ktx\Bricks_pbr.ktx .\Jpg\Bricks_pbr.jpg

 

AO :

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type R –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_AO.ktx .\Jpg\Bricks_AO.jpg

 

KTX dans Evergine

Nous avons ajouté dans Evergine 2025.10 la prise en charge de KTX1 et KTX2, ainsi que de tous les formats de textures compressées propres à chaque plateforme.

C’est une excellente nouvelle pour toutes les applications, et en particulier pour les applications web, car son adoption peut améliorer considérablement les temps de chargement.

Vous pouvez désormais optimiser vos applications graphiques avec un investissement minimal : tout est intégré de manière transparente dans le moteur et très simple à utiliser.

L’utilisateur peut importer des fichiers KTX2 dans l’éditeur comme n’importe quel autre format d’image et les utiliser dans des matériaux. L’extension du fichier doit être « .ktx » ou « .ktx2 ».

Evergine.ImageRuntime a été étendu pour permettre le chargement de fichiers KTX2.

Si vos fichiers GLTF contiennent des images KTX (intégrées ou référencées), tout fonctionnera immédiatement.

Auteur
Alejandro Juan Pérez
Plain Concepts Research