ARM présente un nouvel algorithme de compression de textures : l’ASTC

Dans un SoC, la partie graphique est au moins aussi importante que la partie processeur. Dans le contexte de la mobilité où l’économie d’énergie est reine, l’arrivée d’un algorithme de compression plus efficace est forcément intéressante. En optimisant la bande passante mémoire, l’ASTC pourrait conférer à ARM un atout intéressant vis-à-vis de la concurrence.

ARM n’est pas seulement un fabricant de processeurs, il conçoit aussi des puces graphiques : les Mali. Moins populaires que les GPU PowerVR, on les trouve néanmoins dans les derniers Exynos de Samsung. À la conférence HPG (High Performance Graphics 2012), le leader de la puce mobile a dévoilé une nouvelle technologie de compression de textures : la compression ASTC.

ASTC signifiant « Adaptative Scalable Texture Compression » pour compression de textures adaptative et flexible.

Mais finalement qu’est-ce qu’une texture et pourquoi les compresser ? C’est une question intéressante, car elle nous force à nous pencher sur l’architecture générale des cartes graphiques.

Principe

Fondamentalement, tous les graphismes que vous voyez dans les jeux vidéo sont formés avec les mêmes éléments de base : des polygones et les textures. Les polygones sont des figures géométriques en trois dimensions qui vont décrire la géométrie de la scène. C’est polygones peuvent avoir des couleurs différentes et être éclairés par diverses sources lumineuses, mais pour représenter la complexité d’une scène réelle, c’est un peu juste. En effet, comment représenter la texture du bois du marbre, la rugosité, l’aspect brillant, etc ? C’est le travail des textures. Ce sont des images qui vont être projetées sur les objets en 3D pour accroître le niveau de détail global de la scène. En général, un objet possède plusieurs textures. On va avoir une texture dédiée à la couleur, une autre à la rugosité de la surface (bump mapping), encore une autre dédiée au comportement de la lumière (diffuse mapping) sur l’objet, etc.

Sur chaque polygone, il faut projeter pas moins de cinq textures pour obtenir le résultat final.

Sur un GPU, le travail s’effectue en deux temps : projection géométrique des polygones dans l’espace-écran et remplissage des polygones en fonction de la lumière et des textures. Le MALI 450, par exemple, possède une unité de vertex shading pour le premier travail et huit unités en charge du reste: les pixels (ou fragments) shaders.

Une GTX 680. Chaque carré vert est une unité de calcul. Il y en a 1536...

Comme il y a beaucoup plus de pixels à l’écran que de sommets de polygones, il est logique d’avoir beaucoup plus de pixel shaders que de vertex shaders. Dans le cas des grosses cartes graphiques pour PC, le nombre d’unités de calcul (unifiées dans les cartes modernes) peut dépasser le millier !

Le travail des pixels shaders va donc être de déterminer la couleur de chaque pixel en fonction des sources lumineuses et des textures. Ces dernières étant stockées dans la mémoire vidéo. Voilà donc un nombre assez important d’unités de calcul qui vont effectuer des accès à la mémoire vidéo simultanément. Cette mémoire va donc être d’autant plus sollicitée que les textures sont grosses et les unités de shading nombreuses. Or, outre la taille, une autre caractéristique fondamentale d’une mémoire est sa bande passante. En général celle-ci est relativement limitée, surtout dans les appareils mobiles où l’économie d’énergie est très importante.

 

Si tous le monde accède à la mémoire simultanément, elle peut vite se retrouver saturée.

La saturation de la bande passante mémoire est un problème universel dans un contexte de calcul parallèle. En effet, c’est bien beau d’avoir une multitude de coeurs, mais il faut bien qu’ils travaillent sur quelque chose. Si un processeur n’a aucune donnée à traiter, il est parfaitement inutile. Il est donc très important que les coeurs soient « nourris » convenablement. Pour cela, il faut que la bande passante mémoire soit bien proportionnée. Le problème c’est que les mémoires rapides coûtent cher et consomment beaucoup d’énergie. Une solution intelligente est de limiter la taille des données auxquelles les coeurs vont avoir accès. En compressant les textures on réduit leurs tailles et donc la quantité de données qui va aller et venir entre la mémoire et les unités de calcul.

Aussi, des algorithme de compression de textures, il y en a plein : S3TC, ETC1, PVRTC etc. C’est d’ailleurs une technique relativement ancienne (le S3TC date de 98). En général, il s’agit de compression destructive, comme pour le JPEG par exemple. À ceci près que le mode d’accès aux pixels de l’image doit pouvoir se faire de manière complètement aléatoire. En effet, selon le point de vue que l’on a sur l’objet on va devoir accéder à diverses parties de la texture. Ce point de vue ne peut pas être prévu à l’avance, puisque nous sommes libres de bouger comme bon nous semble dans la scène. Les algorithmes de compression de textures ont donc leur spécificité, et constituent un domaine de recherche à part entière.

Les formats sont nombreux et possèdent tous leurs limitations et leurs avantages. Que ce soit au niveau de la profondeur de couleur, de la taille, du mode de compression, jusqu’à présent aucun n’était « universel ». C’est-à-dire que l’artiste 3D devait choisir un mode de compression selon son cas particulier et s’y tenir, même si ce dernier n’était pas idéal dans tous les cas de figure.

Le format ASTC

Ainsi, et comme son nom l’indique, une des principales forces du format ASTC est sa flexibilité. Une texture peut-être codée en RGB, ou bien avec une formation de transparence (RGBA), en HDR (High Dynamics Range) ou pas, etc. On peut vouloir la compresser avec 2, 4 ou même 8 bits par pixels. Quel que soit le cas de figure, l’ASTC s’y adapte.

Ce n’est pas sa seule force. En termes de qualité, l’ASTC est supérieur ou égal à tout ce qui se fait ailleurs. Une des raisons de cette efficacité vient de l’aspect adaptatif de l’algorithme.

Le principe de compression des textures est un peu toujours le même. On prend l’image en question, et on la découpe en des blocs de taille fixe (4×4, 8×8 ou 16×16 en général). Dans chacun de ces blocs, on analyse les couleurs. On déduit quelle partie de l’espace des couleurs correspond au bloc et on va tracer un segment dans ce sous-espace sur lequel on va indexer les couleurs présentes. On aura choisi au préalable combien de couleurs différentes on va retenir au maximum, c’est-à-dire un budget, en bits, pour représenter le bloc. Au moins on a de couleurs au plus la compression sera élevée et au plus l’image sera dégradée.

Ci dessous, trois exemple de compressions avec l’ASTC.

L'image originale.
Un détail de l'image ci-dessus compressé en ATSC avec 8 bits, 3.56 bits et 2 bits par pixels respectivement.

La force de l’ASTC est de pouvoir utiliser les bits alloués d’une manière optimale ou presque. Il peut par exemple utiliser moins de 1 bit par pixel en considérant des triplets ou des quintuplets de pixels. Sur la totalité du bloc, l’information est ainsi utilisée de la manière la plus harmonieuse possible.

L’algorithme peut aussi « partitionner » l’espace de couleurs. Si un bloc contient juste un dégradé de gris, alors on n’a pas de problème. Mais admettons qu’un bloc contienne un morceau d’une boule rouge et d’un brin d’herbe vert. Dans ce cas-là, l’algorithme va créer non pas un segment, mais deux, un pour chacune des deux teintes. En fait, l’ASTC peut partitionner l’espace de couleurs en deux, trois ou quatre parties sans impact sur les performances.

Une texture n’est pas forcément une image, comme la photo d’un morceau de bois ou de marbre à appliquer sur un objet. Une texture peut représenter des informations géométriques (normal maps), de transparence, de réflexion, etc. dans ce genre de cas on peut parfaitement n’avoir aucune corrélations entre les différents canaux (RGBA) de la texture. Le canal de transparence (alpha) peut parfaitement être complètement décoléré des canaux RGB. L’ASTC va alors les considérer séparément pour décrire la texture le mieux possible.

Et quand on vous dit que l’ASTC est adaptatif, ce n’est pas une blague ! Tous les ajustements décrits plus haut, ainsi que d’autres, peuvent être choisis indépendamment pour chaque bloc. Seule la configuration globale des blocs doit être fixée à l’avance.

En conclusion, l’ASTC se révèle être un progrès significatif qui pourrait donner aux prochaines cartes graphiques Mali un avantage substantiel. S’il est agréable d’avoir des textures de meilleure qualité, on suppose plutôt qu’à qualité équivalente le gain d’espace en mémoire vidéo fera la différence.

En effet, une manière très simple d’augmenter les performances d’un jeu vidéo consiste souvent à abaisser la résolution des textures. Des textures plus petites, ou mieux compressées se traduiront inévitablement par des meilleures performances. L’ASTC pourrait ainsi être un atout pour ARM dans sa conquête des parts de marché des PowerVR…

Ci dessous, une comparaison entre l’ASTC et un autre algorithme de compression populaire, le PVRTC.

Image originale.
Image compressée à 2 bits par pixel avec un autre algorithme: PVRTC
Image compressée en 2 bits par pixel en ATSC.

 

 source

le 2 53
-

2 Comments

    1.  En fait, je jpeg n’est pas  mort de toute façon. Comme je l’écrit, les format ASTC et JPEG répondent à des besoins très différents. Le but est en effet d’avoir les textures compressées en mémoire et de les utiliser telles quelles. Or, le JPEG ne permet pas d’accéder facilement aux pixels de l’image sans la décompresser au préalable. L’ATSC permet d’utiliser la texture directement dans son format compressé.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *