Freigeben über


Texturen mit Alphakanälen (Direct3D 9)

Es gibt zwei Möglichkeiten zum Codieren von Texturzuordnungen, die komplexere Transparenz aufweisen. In jedem Fall steht ein Block, der die Transparenz beschreibt, dem bereits beschriebenen 64-Bit-Block voraus. Die Transparenz wird entweder als 4x4-Bitmap mit 4 Bit pro Pixel (explizite Codierung) oder mit weniger Bits und linearer Interpolation dargestellt, die analog zur Farbcodierung verwendet wird.

Der Transparenzblock und der Farbblock werden wie in der folgenden Tabelle dargestellt angeordnet.

Word-Adresse 64-Bit-Block
3:0 Transparenzblock
7:4 Zuvor beschriebener 64-Bit-Block

 

Explizite Texturcodierung

Bei expliziter Texturcodierung (DXT2- und DXT3-Formaten) werden die Alphakomponenten der Texel, die Transparenz beschreiben, in einer 4x4-Bitmap mit 4 Bit pro Texel codiert. Diese vier Bits können durch eine Vielzahl von Mitteln wie Dithering oder mithilfe der vier wichtigsten Bits der Alphadaten erreicht werden. Sie werden jedoch hergestellt, so wie sie auch ohne Interpolation verwendet werden.

Das folgende Diagramm zeigt einen 64-Bit-Transparenzblock.

Diagramm eines 64-Bit-Transparenzblocks

Anmerkung

Die Komprimierungsmethode von Direct3D verwendet die vier wichtigsten Bits.

 

Die folgenden Tabellen veranschaulichen, wie die Alphainformationen im Arbeitsspeicher für jedes 16-Bit-Wort angeordnet sind.

Diese Tabelle enthält das Layout für Wort 0.

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

 

*Kleinstes signifikantes Bit, wichtigstes Bit (MSB)

Diese Tabelle enthält das Layout für Word 1.

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

 

Diese Tabelle enthält das Layout für Word 2.

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

 

Diese Tabelle enthält das Layout für Word 3.

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

 

Der Unterschied zwischen DXT2 und DXT3 besteht darin, dass im DXT2-Format davon ausgegangen wird, dass die Farbdaten durch Alpha vormultipliziert wurden. Im DXT3-Format wird davon ausgegangen, dass die Farbe nicht durch Alpha vormultipliziert wird. Diese beiden Formate sind erforderlich, da in den meisten Fällen, wenn eine Textur verwendet wird, nur die Daten zu untersuchen, nicht ausreicht, um festzustellen, ob die Farbwerte mit Alpha multipliziert wurden. Da diese Informationen zur Laufzeit benötigt werden, werden die beiden FOURCC-Codes verwendet, um diese Fälle zu unterscheiden. Die für diese beiden Formate verwendete Daten- und Interpolationsmethode ist jedoch identisch.

Der farbvergleich, der in DXT1 verwendet wird, um zu bestimmen, ob das Texel transparent ist, wird in diesem Format nicht verwendet. Es wird davon ausgegangen, dass ohne die Farbe die Farbdaten immer so behandelt werden, als ob im 4-Farbmodus. Mit anderen Worten: Die If-Anweisung oben im DXT1-Code sollte folgendes sein:

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

Three-Bit Lineare Alpha-Interpolation

Die Codierung der Transparenz für die DXT4- und DXT5-Formate basiert auf einem Konzept, das der linearen Codierung ähnelt, die für Die Farbe verwendet wird. Zwei 8-Bit-Alphawerte und eine 4x4-Bitmap mit drei Bit pro Pixel werden in den ersten acht Bytes des Blocks gespeichert. Die repräsentativen Alphawerte werden verwendet, um Zwischen alphawerte zu interpolieren. Zusätzliche Informationen stehen in der Art und Weise zur Verfügung, wie die beiden Alphawerte gespeichert werden. Wenn alpha_0 größer als alpha_1 ist, werden sechs Alpha-Zwischenwerte durch die Interpolation erstellt. Andernfalls werden vier Zwischen alphawerte zwischen den angegebenen Alpha-Extremen interpoliert. Die beiden zusätzlichen impliziten Alphawerte sind 0 (vollständig transparent) und 255 (vollständig undurchsichtig).

Das folgende Codebeispiel veranschaulicht diesen Algorithmus.

// 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
}

Das Speicherlayout des Alphablocks lautet wie folgt:

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

 

Der Unterschied zwischen DXT4 und DXT5 besteht darin, dass im DXT4-Format davon ausgegangen wird, dass die Farbdaten durch Alpha prämultipliziert wurden. Im DXT5-Format wird angenommen, dass die Farbe nicht durch Alpha vormultipliziert wird. Diese beiden Formate sind erforderlich, da in den meisten Fällen, wenn eine Textur verwendet wird, nur die Daten zu untersuchen, nicht ausreicht, um festzustellen, ob die Farbwerte mit Alpha multipliziert wurden. Da diese Informationen zur Laufzeit benötigt werden, werden die beiden FOURCC-Codes verwendet, um diese Fälle zu unterscheiden. Die für diese beiden Formate verwendete Daten- und Interpolationsmethode ist jedoch identisch.

Der farbvergleich, der in DXT1 verwendet wird, um festzustellen, ob das Texel transparent ist, wird mit diesen Formaten nicht verwendet. Es wird davon ausgegangen, dass ohne die Farbe die Farbdaten immer so behandelt werden, als ob im 4-Farbmodus. Anders ausgedrückt: Die If-Anweisung oben im DXT1-Code sollte folgendes sein:

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

komprimierte Texturressourcen