Freigeben über


Texturen mit Alphakanälen

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

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

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

Explizite Texturcodierung

Für die explizite Texturcodierung (BC2-Format) werden die Alphakomponenten der Texel, die 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 durch die Verwendung der vier wichtigsten Bits der Alphadaten erreicht werden. Wie auch immer sie produziert werden, sie werden genauso verwendet, wie sie sind, ohne jegliche Form von Interpolation.

Das folgende Diagramm zeigt einen 64-Bit-Transparenzblock.

Diagramm eines 64-Bit-Transparenzblocks

Hinweis Die Komprimierungsmethode von Direct3D verwendet die vier wichtigsten Bits.

 

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

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, wichtigstes Bit (MSB)

Layout für Wort 1:

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

 

Layout für Wort 2:

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

 

Layout für Wort 3:

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

 

Der Farbvergleich, der in BC1 verwendet wird, um zu bestimmen, ob der Texel transparent ist, wird in diesem Format nicht verwendet. Es wird davon ausgegangen, dass die Farbdaten ohne den Farbvergleich immer wie im 4-Farbmodus behandelt werden.

Lineare Drei-Bit-Alpha-Interpolation

Die Codierung der Transparenz für das BC3-Format basiert auf einem Konzept, das der für Farben verwendeten linearen Codierung ähnelt. In den ersten acht Bytes des Blocks werden zwei 8-Bit-Alphawerte und eine 4x4-Bitmap mit drei Bits pro Pixel gespeichert. Die repräsentativen Alphawerte werden verwendet, um Alpha-Zwischenwerte zu interpolieren. Zusätzliche Informationen sind in der Art und Weise verfügbar, wie die beiden Alphawerte gespeichert werden. Wenn alpha_0 größer als alpha_1 ist, werden durch die Interpolation sechs Alpha-Zwischenwerte erstellt. Andernfalls werden vier Alpha-Zwischenwerte 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 sieht wie folgt aus:

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 Farbvergleich, der in BC1 verwendet wird, um zu bestimmen, ob der Texel transparent ist, wird bei diesen Formaten nicht verwendet. Es wird davon ausgegangen, dass die Farbdaten ohne den Farbvergleich immer wie im 4-Farbmodus behandelt werden.

Komprimierte Texturressourcen