Partager via


Textures avec canaux Alpha (Direct3D 9)

Il existe deux façons d’encoder des cartes de texture qui présentent une transparence plus complexe. Dans chaque cas, un bloc qui décrit la transparence précède le bloc 64 bits déjà décrit. La transparence est représentée sous la forme d’une bitmap 4x4 avec 4 bits par pixel (encodage explicite), ou avec moins de bits et d’interpolation linéaire analogue à ce qui est utilisé pour l’encodage de couleur.

Le bloc de transparence et le bloc de couleur sont organisés comme indiqué dans le tableau suivant.

Adresse Word Bloc 64 bits
3:0 Bloc de transparence
7:4 Bloc 64 bits décrit précédemment

 

Encodage de texture explicite

Pour l’encodage de texture explicite (formats DXT2 et DXT3), les composants alpha des texels qui décrivent la transparence sont encodés dans une bitmap 4x4 avec 4 bits par texel. Ces quatre bits peuvent être obtenus par le biais d’une variété de moyens tels que la trame ou en utilisant les quatre bits les plus significatifs des données alpha. Toutefois, elles sont produites, elles sont utilisées comme elles le sont, sans aucune forme d’interpolation.

Le diagramme suivant illustre un bloc de transparence 64 bits.

diagramme d’un bloc de transparence 64 bits

Note

La méthode de compression de Direct3D utilise les quatre bits les plus significatifs.

 

Les tableaux suivants illustrent la façon dont les informations alpha sont disposées en mémoire, pour chaque mot 16 bits.

Ce tableau contient la disposition du mot 0.

Bribes Alpha
3:0 (LSB*) [0][0]
7:4 [0][1]
11:8 [0][2]
15:12 (MSB*) [0][3]

 

*bit le moins significatif, bit le plus significatif (MSB)

Ce tableau contient la disposition du mot 1.

Bribes Alpha
3:0 (LSB) [1][0]
7:4 [1][1]
11:8 [1][2]
15:12 (MSB) [1][3]

 

Ce tableau contient la disposition du mot 2.

Bribes Alpha
3:0 (LSB) [2][0]
7:4 [2][1]
11:8 [2][2]
15:12 (MSB) [2][3]

 

Ce tableau contient la disposition du mot 3.

Bribes Alpha
3:0 (LSB) [3][0]
7:4 [3][1]
11:8 [3][2]
15:12 (MSB) [3][3]

 

La différence entre DXT2 et DXT3 est que, au format DXT2, il est supposé que les données de couleur ont été prémultipliées par alpha. Dans le format DXT3, il est supposé que la couleur n’est pas prémultipliée par alpha. Ces deux formats sont nécessaires car, dans la plupart des cas, une texture est utilisée, l’examen des données n’est pas suffisant pour déterminer si les valeurs de couleur ont été multipliées par alpha. Étant donné que ces informations sont nécessaires au moment de l’exécution, les deux codes FOURCC sont utilisés pour différencier ces cas. Toutefois, la méthode de données et d’interpolation utilisée pour ces deux formats est identique.

Comparaison de couleurs utilisée dans DXT1 pour déterminer si le texel est transparent n’est pas utilisé dans ce format. Il est supposé que, sans la comparaison de couleurs, les données de couleur sont toujours traitées comme si elles étaient en mode 4 couleurs. En d’autres termes, l’instruction if en haut du code DXT1 doit être la suivante :

if ((color_0 > color_1) OR !DXT1) {

Interpolation alpha linéaire Three-Bit

L’encodage de transparence pour les formats DXT4 et DXT5 est basé sur un concept similaire à l’encodage linéaire utilisé pour la couleur. Deux valeurs alpha 8 bits et une bitmap 4x4 avec trois bits par pixel sont stockées dans les huit premiers octets du bloc. Les valeurs alpha représentatives sont utilisées pour interpoler les valeurs alpha intermédiaires. Des informations supplémentaires sont disponibles dans la façon dont les deux valeurs alpha sont stockées. Si alpha_0 est supérieur à alpha_1, six valeurs alpha intermédiaires sont créées par l’interpolation. Sinon, quatre valeurs alpha intermédiaires sont interpolées entre les extrêmes alpha spécifiés. Les deux valeurs alpha implicites supplémentaires sont 0 (entièrement transparentes) et 255 (entièrement opaques).

L’exemple de code suivant illustre cet algorithme.

// 8-alpha or 6-alpha block?    
if (alpha_0 > alpha_1) {    
    // 8-alpha block:  derive the other six alphas.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (6 * alpha_0 + 1 * alpha_1 + 3) / 7;    // bit code 010
    alpha_3 = (5 * alpha_0 + 2 * alpha_1 + 3) / 7;    // bit code 011
    alpha_4 = (4 * alpha_0 + 3 * alpha_1 + 3) / 7;    // bit code 100
    alpha_5 = (3 * alpha_0 + 4 * alpha_1 + 3) / 7;    // bit code 101
    alpha_6 = (2 * alpha_0 + 5 * alpha_1 + 3) / 7;    // bit code 110
    alpha_7 = (1 * alpha_0 + 6 * alpha_1 + 3) / 7;    // bit code 111  
}    
else {  
    // 6-alpha block.    
    // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
    alpha_2 = (4 * alpha_0 + 1 * alpha_1 + 2) / 5;    // Bit code 010
    alpha_3 = (3 * alpha_0 + 2 * alpha_1 + 2) / 5;    // Bit code 011
    alpha_4 = (2 * alpha_0 + 3 * alpha_1 + 2) / 5;    // Bit code 100
    alpha_5 = (1 * alpha_0 + 4 * alpha_1 + 2) / 5;    // Bit code 101
    alpha_6 = 0;                                      // Bit code 110
    alpha_7 = 255;                                    // Bit code 111
}

La disposition de la mémoire du bloc alpha est la suivante :

Octet Alpha
0 Alpha_0
1 Alpha_1
2 [0][2] (2 MSB), [0][1], [0][0]
3 [1][1] (1 MSB), [1][0], [0][3], [0][2] (1 LSB)
4 [1][3], [1][2], [1][1] (2 LSB)
5 [2][2] (2 MSB), [2][1], [2][0]
6 [3][1] (1 MSB), [3][0], [2][3], [2][2] (1 LSB)
7 [3][3], [3][2], [3][1] (2 LSB)

 

La différence entre DXT4 et DXT5 est que dans le format DXT4, il est supposé que les données de couleur ont été prémultipliées par alpha. Dans le format DXT5, il est supposé que la couleur n’est pas prémultipliée par alpha. Ces deux formats sont nécessaires car, dans la plupart des cas, une texture est utilisée, l’examen des données n’est pas suffisant pour déterminer si les valeurs de couleur ont été multipliées par alpha. Étant donné que ces informations sont nécessaires au moment de l’exécution, les deux codes FOURCC sont utilisés pour différencier ces cas. Toutefois, la méthode de données et d’interpolation utilisée pour ces deux formats est identique.

Comparaison de couleurs utilisée dans DXT1 pour déterminer si le texel est transparent n’est pas utilisé avec ces formats. Il est supposé que, sans la comparaison de couleurs, les données de couleur sont toujours traitées comme si elles étaient en mode 4 couleurs. En d’autres termes, l’instruction if en haut du code DXT1 doit être :

if ((color_0 > color_1) OR !DXT1) {

ressources de texture compressées