Contexte et objectifs

Le blog décrit la conversion d’une texture 1024×1024 RGBA au format BC7 entre PC et consoles. L’auteur travaille chez 505 Games sur le port d’un moteur propriétaire, ce qui impose de calculer l’adresse mémoire de chaque élément de la texture. Le problème central est la différence d’ordre de stockage selon les plateformes, même si la hiérarchie (pixels → blocs → mips → tuiles) reste identique.

Compression par blocs BC7

BC7 stocke les texels dans des blocs de 4×4. Chaque bloc occupe 16 octets, soit 1 octet par texel, ce qui représente un facteur de compression de comparé à un RGBA non compressé (4 octets par texel). Le format encode deux couleurs de référence (end‑points) et un indice de 2 bits par texel pour interpoler entre ces couleurs. Cette approche réduit la bande passante mémoire, mais introduit une complexité supplémentaire : le code doit distinguer les accès « texel » des accès « bloc », sinon les offsets seront erronés.

Ordonnancement des texels et tuiles

Dans un rendu performant, les texels sont réordonnés pour optimiser la cache locality. Au lieu d’un flux linéaire ligne‑par‑ligne, les blocs sont souvent stockés selon un motif morton (Z‑order) ou en tuiles rectangulaires. Cette disposition rapproche physiquement les texels qui seront souvent échantillonnés ensemble, ce qui diminue les temps d’attente du GPU. Le texte souligne que, même si on ignore les paramètres de pitch ou de profondeur, le calcul d’adresse doit intégrer le facteur de tiling propre à chaque API (DirectX 12 étant la référence utilisée).

Implications pour la conversion multi‑plateforme

Lors de la conversion, il faut recomposer la même hiérarchie : mip‑maps (versions réduites de la texture), tiles (groupes de blocs) et offsets de profondeur ou d’array. Chaque niveau de mip‑map divise la résolution par deux, ce qui multiplie le nombre de blocs par quatre à chaque niveau supérieur. Le calcul d’adresse final combine donc : (i) l’indice du mip‑map, (ii) la position du bloc dans la tuile, (iii) le numéro du bloc dans le tableau, et (iv) le décalage interne du texel dans le bloc (2 bits). Omettre l’un de ces paramètres conduit à des artefacts visuels ou à des plantages de chargement. Le post montre que, malgré la complexité apparente, la logique repose sur des opérations arithmétiques simples (multiplications et décalages) appliquées de façon cohérente.