Texturen mit Alphakanälen (Direct3D 9)
Es gibt zwei Möglichkeiten, Texturkarten zu codieren, die eine komplexere Transparenz aufweisen. In jedem Fall wird dem bereits beschriebenen 64-Bit-Block ein Block vorangestellt, der die Transparenz beschreibt. Die Transparenz wird entweder als 4x4-Bitmap mit 4 Bits pro Pixel (explizite Codierung) oder mit weniger Bits und linearer Interpolation dargestellt, die der für die Farbcodierung verwendeten entspricht.
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 (DXT2- und DXT3-Formate) werden die Alphakomponenten der Texel, die die Transparenz beschreiben, in einer 4x4-Bitmap mit 4 Bits 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 hergestellt werden, sie werden genauso verwendet, wie sie sind, ohne jegliche Form von Interpolation.
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 für jedes 16-Bit-Wort im Arbeitsspeicher 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 Uhr (MSB*) | [0] [3] |
*Geringstes Bit, wichtigstes Bit (MSB)
Diese Tabelle enthält das Layout für Wort 1.
Bits | Alpha |
---|---|
3:0 (LSB) | [1] [0] |
7:4 | [1][1] |
11:8 | [1] [2] |
15:12 Uhr (MSB) | [1] [3] |
Diese Tabelle enthält das Layout für Wort 2.
Bits | Alpha |
---|---|
3:0 (LSB) | [2] [0] |
7:4 | [2] [1] |
11:8 | [2][2] |
15:12 Uhr (MSB) | [2] [3] |
Diese Tabelle enthält das Layout für Wort 3.
Bits | Alpha |
---|---|
3:0 (LSB) | [3] [0] |
7:4 | [3] [1] |
11:8 | [3] [2] |
15:12 Uhr (MSB) | [3][3] |
Der Unterschied zwischen DXT2 und DXT3 besteht darin, dass im DXT2-Format davon ausgegangen wird, dass die Farbdaten mit Alpha vormultipliziert wurden. Im DXT3-Format wird davon ausgegangen, dass die Farbe nicht mit Alpha vormultipliziert ist. 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 Daten- und Interpolationsmethode, die für diese beiden Formate verwendet wird, sind 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 den Farbvergleich die Farbdaten immer wie im 4-Farbmodus behandelt werden. Anders ausgedrückt, die if-Anweisung am Anfang des DXT1-Codes sollte wie folgt aussehen:
if ((color_0 > color_1) OR !DXT1) {
Three-Bit Lineare Alphainterpolation
Die Codierung der Transparenz für das DXT4- und DXT5-Format basiert auf einem Konzept, das der linearen Codierung für Farben ähnelt. Zwei 8-Bit-Alphawerte und eine 4x4-Bitmap mit drei Bits pro Pixel werden in den ersten acht Bytes des Blocks gespeichert. Die repräsentativen Alphawerte werden verwendet, um zwischengeschaltete Alphawerte 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 sechs Alpha-Zwischenwerte durch die Interpolation 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).
Im folgenden Codebeispiel wird dieser Algorithmus veranschaulicht.
// 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 Unterschied zwischen DXT4 und DXT5 besteht darin, dass im DXT4-Format davon ausgegangen wird, dass die Farbdaten mit Alpha vormultipliziert wurden. Im DXT5-Format wird davon ausgegangen, dass die Farbe nicht mit Alpha vormultipliziert ist. Diese beiden Formate sind erforderlich, da in den meisten Fällen, wenn eine Textur verwendet wird, allein die Untersuchung der Daten 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 Daten- und Interpolationsmethode, die für diese beiden Formate verwendet wird, sind jedoch identisch.
Der Farbvergleich, der in DXT1 verwendet wird, um zu bestimmen, ob das 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. Mit anderen Worten, die if-Anweisung am Anfang des DXT1-Codes sollte wie folgt sein:
if ((color_0 > color_1) OR !DXT1) {
Zugehörige Themen