Partager via


Textures avec canaux alpha

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 (format BC2), 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

Notez que 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.

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, bit le plus significatif (MSB)

Disposition du mot 1 :

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

 

Disposition du mot 2 :

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

 

Disposition du mot 3 :

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

 

Comparaison de couleurs utilisée dans BC1 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.

Interpolation alpha linéaire à trois bits

L’encodage de transparence pour le format BC3 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 :

Byte 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)

 

Comparaison de couleurs utilisée dans BC1 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.

Ressources de texture compressées