Freigeben über


Undurchsichtige und 1-Bit-Alphatexturen

Das Texturformat BC1 ist für Texturen vorgesehen, die undurchsichtig sind oder eine einzelne transparente Farbe aufweisen.

Für jeden undurchsichtigen oder 1-Bit-Alphablock werden zwei 16-Bit-Werte (RGB 5:6:5-Format) und eine 4x4-Bitmap mit 2 Bit pro Pixel gespeichert. Dies summiert 64 Bit für 16 Texel oder vier Bit pro Texel. In der Blockbitmap gibt es 2 Bit pro Texel, um zwischen den vier Farben auszuwählen, von denen zwei in den codierten Daten gespeichert sind. Die anderen beiden Farben werden von diesen gespeicherten Farben durch lineare Interpolation abgeleitet. Dieses Layout wird im folgenden Diagramm dargestellt.

Diagramm des Bitmaplayouts

Das 1-Bit-Alphaformat unterscheidet sich vom undurchsichtigen Format, indem die zwei im Block gespeicherten 16-Bit-Farbwerte verglichen werden. Sie werden als ganze Zahlen ohne Vorzeichen behandelt. Wenn die erste Farbe größer als die zweite ist, bedeutet dies, dass nur undurchsichtige Texel definiert sind. Dies bedeutet, dass vier Farben verwendet werden, um die Texel darzustellen. Bei der vierfarbigen Codierung gibt es zwei abgeleitete Farben, und alle vier Farben werden im RGB-Farbraum gleichmäßig verteilt. Dieses Format entspricht dem RGB 5:6:5-Format. Andernfalls werden für die 1-Bit-Alphatransparenz drei Farben verwendet, und der vierte ist reserviert, um transparente Texel darzustellen.

Bei der dreifarbigen Codierung gibt es eine abgeleitete Farbe, und der vierte 2-Bit-Code ist reserviert, um ein transparentes Texel (Alphainformationen) anzugeben. Dieses Format entspricht RGBA 5:5:5:1, wobei das letzte Bit zum Codieren der Alphamaske verwendet wird.

Im folgenden Codebeispiel wird der Algorithmus veranschaulicht, um zu entscheiden, ob drei- oder vierfarbige Codierung ausgewählt ist:

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;    

}

Es wird empfohlen, die RGBA-Komponenten des Transparenzpixels vor der Vermischung auf Null festzulegen.

Die folgenden Tabellen zeigen das Speicherlayout für den 8-Byte-Block. Es wird angenommen, dass der erste Index der y-Koordinate entspricht und die zweite der X-Koordinate entspricht. Beispielsweise bezieht sich Texel[1][2] auf das Texturzuordnungspixel bei (x,y) = (2,1).

Im Folgenden sehen Sie das Speicherlayout für den 8-Byte-Block (64-Bit):

Word-Adresse 16-Bit-Wort
0 Color_0
1 Color_1
2 Bitmap-Word_0
3 Bitmap-Word_1

 

Color_0 und Color_1 werden die Farben an den beiden Extremen wie folgt angeordnet:

Bits Color
4:0 (LSB*) Blaue Farbkomponente
10:5 Grüne Farbkomponente
15:11 Rote Farbkomponente

 

*Kleinstes signifikantes Bit

Bitmap-Word_0 ist wie folgt angeordnet:

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]

 

*wichtigstes Bit (MSB)

Bitmap-Word_1 ist wie folgt angeordnet:

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]

 

Beispiel für eine undurchsichtige Farbcodierung

Als Beispiel für eine undurchsichtige Codierung wird davon ausgegangen, dass die Farben Rot und Schwarz an den Extremen liegen. Rot ist color_0, und schwarz ist color_1. Es gibt vier interpolierte Farben, die den gleichmäßig verteilten Farbverlauf zwischen ihnen bilden. Um die Werte für die 4x4-Bitmap zu ermitteln, werden die folgenden Berechnungen verwendet:

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

Die Bitmap sieht dann wie im folgenden Diagramm aus.

Diagramm des erweiterten Bitmaplayouts für Rot und Schwarz.

Dies sieht wie die folgende veranschaulichte Reihe von Farben aus.

Hinweis In einem Bild wird das Pixel (0,0) oben links angezeigt.

 

Abbildung eines undurchsichtigen codierten Farbverlaufs

Beispiel für die 1-Bit-Alphacodierung

Dieses Format wird ausgewählt, wenn die nicht signierte 16-Bit-Ganzzahl, color_0, kleiner als die nicht signierte 16-Bit-Ganzzahl color_1 ist. Ein Beispiel dafür, wo dieses Format verwendet werden kann, ist Blätter auf einem Baum, dargestellt gegen einen blauen Himmel. Einige Texel können als transparent gekennzeichnet werden, während für die Blätter noch drei Grünschatten zur Verfügung stehen. Zwei Farben korrigieren die Extreme, und der dritte ist eine interpolierte Farbe.

Die folgende Abbildung ist ein Beispiel für ein solches Bild.

Abbildung der 1-Bit-Alphacodierung

Wenn das Bild als weiß dargestellt wird, würde das Texel als transparent codiert. Die RGBA-Komponenten der transparenten Texel sollten vor der Vermischung auf Null festgelegt werden.

Die Bitmapcodierung für die Farben und die Transparenz wird mithilfe der folgenden Berechnungen bestimmt.

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

Die Bitmap sieht dann wie im folgenden Diagramm aus.

Diagramm des erweiterten Bitmaplayouts für helleres Grün und dunkleres Grün.

Komprimierte Texturressourcen