Texturen mit Alphakanälen
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 (BC2-Format) 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.
Hinweis 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.
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)
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 Word 2:
Bits | Alpha |
---|---|
3:0 (LSB) | [2] [0] |
7:4 | [2] [1] |
11:8 | [2][2] |
15:12 (MSB) | [2] [3] |
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 farbvergleich, der in BC1 verwendet wird, um festzustellen, 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.
Drei-Bit-lineare Alpha-Interpolation
Die Codierung der Transparenz für das BC3-Format 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 farbvergleich, der in BC1 verwendet wird, um zu bestimmen, 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.
Verwandte Themen