Partager via


Textures alpha opaques et 1 bits (Direct3D 9)

Le format de texture DXT1 s’adresse aux textures opaques ou ayant une seule couleur transparente.

Pour chaque bloc alpha opaque ou 1 bits, deux valeurs 16 bits (format RVB 5:6:5) et une bitmap 4x4 avec 2 bits par pixel sont stockées. Cela totalise 64 bits pour 16 texels, soit quatre bits par texel. Dans la bitmap de bloc, il y a 2 bits par texel à sélectionner entre les quatre couleurs, dont deux sont stockées dans les données encodées. Les deux autres couleurs sont dérivées de ces couleurs stockées par interpolation linéaire. Cette disposition est illustrée dans le diagramme suivant.

diagramme de la disposition bitmap

Le format alpha 1 bits se distingue du format opaque en comparant les deux valeurs de couleur 16 bits stockées dans le bloc. Ils sont traités comme des entiers non signés. Si la première couleur est supérieure à la seconde, cela implique que seuls les texels opaques sont définis. Cela signifie que quatre couleurs sont utilisées pour représenter les texels. Dans l’encodage à quatre couleurs, il existe deux couleurs dérivées et les quatre couleurs sont également distribuées dans l’espace de couleurs RVB. Ce format est analogue au format RVB 5:6:5. Sinon, pour la transparence alpha 1 bits, trois couleurs sont utilisées et la quatrième est réservée pour représenter des texels transparents.

Dans l’encodage tricolore, il existe une couleur dérivée et le quatrième code 2 bits est réservé pour indiquer un texel transparent (informations alpha). Ce format est analogue à RVBA 5:5:5:1, où le bit final est utilisé pour encoder le masque alpha.

L’exemple de code suivant illustre l’algorithme permettant de décider si l’encodage à trois ou quatre couleurs est sélectionné :

if (color_0 > color_1) 
{
    // Four-color block: derive the other two colors.    
    // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block.
    color_2 = (2 * color_0 + color_1 + 1) / 3;
    color_3 = (color_0 + 2 * color_1 + 1) / 3;
}    
else
{ 
    // Three-color block: derive the other color.
    // 00 = color_0,  01 = color_1,  10 = color_2,  
    // 11 = transparent.
    // These 2-bit codes correspond to the 2-bit fields 
    // stored in the 64-bit block. 
    color_2 = (color_0 + color_1) / 2;    
    color_3 = transparent;    

}

Il est recommandé de définir les composants RVBA du pixel de transparence sur zéro avant de fusionner.

Les tableaux suivants montrent la disposition de la mémoire pour le bloc de 8 octets. Il est supposé que le premier index correspond à la coordonnée y et le second à la coordonnée x. Par exemple, Texel[1][2] fait référence au pixel de la carte de texture à (x,y) = (2,1).

Ce tableau contient la disposition de la mémoire pour le bloc de 8 octets (64 bits).

adresse Word Mot 16 bits
0 Color_0
1 Color_1
2 Bitmap Word_0
3 Bitmap Word_1

 

Color_0 et Color_1, les couleurs aux deux extrêmes sont disposées comme suit :

Bits Color
4:0 (LSB*) Composant de couleur bleue
10:5 Composant de couleur verte
15:11 Composant de couleur rouge

 

*bit le moins significatif

Les Word_0 bitmap sont disposés comme suit :

Bits Texel
1:0 (LSB) Texel[0][0]
3:2 Texel[0][1]
5:4 Texel[0][2]
7:6 Texel[0][3]
9:8 Texel[1][0]
11:10 Texel[1][1]
13:12 Texel[1][2]
15:14 (MSB*) Texel[1][3]

 

*bit le plus significatif (MSB)

Les Word_1 bitmap sont disposés comme suit :

Bits Texel
1:0 (LSB) Texel[2][0]
3:2 Texel[2][1]
5:4 Texel[2][2]
7:6 Texel[2][3]
9:8 Texel[3][0]
11:10 Texel[3][1]
13:12 Texel[3][2]
15:14 (MSB) Texel[3][3]

 

Exemple d’encodage de couleur opaque

À titre d’exemple d’encodage opaque, supposons que les couleurs rouge et noir sont aux extrêmes. Le rouge est color_0 et le noir est color_1. Il existe quatre couleurs interpolées qui forment le dégradé uniformément distribué entre elles. Pour déterminer les valeurs de l’image bitmap 4x4, les calculs suivants sont utilisés :

00 ? color_0
01 ? color_1
10 ? 2/3 color_0 + 1/3 color_1
11 ? 1/3 color_0 + 2/3 color_1

La bitmap ressemble ensuite au diagramme suivant.

Diagramme montrant la disposition bitmap développée.

Cela ressemble à la série de couleurs illustrée suivante.

Notes

Dans une image, le pixel (0,0) s’affiche en haut à gauche.

 

illustration d’un dégradé opaque encodé

Exemple d’encodage alpha 1 bits

Ce format est sélectionné lorsque l’entier 16 bits non signé, color_0, est inférieur à l’entier 16 bits non signé, color_1. Un exemple de l’endroit où ce format peut être utilisé est les feuilles d’un arbre, affichées sur un ciel bleu. Certains texels peuvent être marqués comme transparents tandis que trois nuances de vert sont encore disponibles pour les feuilles. Deux couleurs fixent les extrêmes, et la troisième est une couleur interpolée.

L’illustration suivante est un exemple d’une telle image.

illustration de l’encodage alpha 1 bits

Notez que lorsque l’image est affichée en blanc, le texel est encodé comme transparent. Notez également que les composants RVBA des texels transparents doivent être définis sur zéro avant le mélange.

L’encodage bitmap pour les couleurs et la transparence est déterminé à l’aide des calculs suivants.

00 ? color_0
01 ? color_1
10 ? 1/2 color_0 + 1/2 color_1
11   ?   Transparent

La bitmap ressemble ensuite au diagramme suivant.

diagramme de la disposition bitmap développée

Ressources de texture compressée