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 une interpolation linéaire qui est analogue à ce qui est utilisé pour l’encodage des couleurs.

Le bloc de transparence et le bloc de couleurs 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 divers moyens tels que le dithering ou en utilisant les quatre bits les plus significatifs des données alpha. Quelle que soit leur production, elles sont utilisées comme elles sont, sans aucune forme d’interpolation.

Le diagramme suivant montre un bloc de transparence 64 bits.

diagramme d’un bloc de transparence 64 bits

Notes

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.

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

 

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

Ce tableau contient la disposition du mot 1.

Bits 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.

Bits 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.

Bits 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, dans le format DXT2, il est supposé que les données de couleur ont été prémultipliées par alpha. Au 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, au moment où une texture est utilisée, il ne suffit pas d’examiner les données 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.

La comparaison de couleurs utilisée dans DXT1 pour déterminer si le texel est transparent n’est pas utilisée dans ce format. Il est supposé que sans la comparaison de couleur, 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 la 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 des valeurs alpha intermédiaires. Des informations supplémentaires sont disponibles sur 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ées. Les deux valeurs alpha implicites supplémentaires sont 0 (entièrement transparent) et 255 (entièrement opaque).

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 :

Byte Alpha
0 Alpha_0
1 Alpha_1
2 [0] [2] (2 MMB), [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 MMB), [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 LSBs)

 

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, au moment où une texture est utilisée, le simple 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.

La comparaison de couleurs utilisée dans DXT1 pour déterminer si le texel est transparent n’est pas utilisée 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