Share via


Texture alfa opache e a 1 bit

Il formato di texture BC1 riguarda le texture opache o con un singolo colore trasparente.

Per ogni blocco alfa opaco o a 1 bit, vengono archiviati due valori a 16 bit (formato RGB 5:6:5) e una bitmap 4x4 con 2 bit per pixel. Questo totale è di 64 bit per 16 texel o quattro bit per texel. Nella bitmap del blocco sono presenti 2 bit per texel da selezionare tra i quattro colori, due dei quali vengono archiviati nei dati codificati. Gli altri due colori derivano da questi colori archiviati tramite interpolazione lineare. Questo layout viene mostrato nel diagramma successivo.

diagram of the bitmap layout

Il formato alfa a 1 bit è distinto dal formato opaco confrontando i due valori di colore a 16 bit archiviati nel blocco. Vengono considerati numeri interi senza segno. Se il primo colore è maggiore del secondo, ciò implica che vengono definiti solo texel opachi. Ciò significa anche che vengono usati quattro colori per rappresentare i texel. Nella codifica a quattro colori, ci sono due colori derivati e tutti e quattro i colori sono equamente distribuiti nello spazio dei colori RGB. Questo formato è analogo al formato RGB 5:6:5. In caso contrario, per la trasparenza alfa a 1 bit vengono usati tre colori e il quarto è riservato per rappresentare texel trasparenti.

Nella codifica a tre colori è presente un colore derivato e il quarto codice a 2 bit è riservato per indicare un texel trasparente (informazioni alfa). Questo formato è analogo a RGBA 5:5:5:1, dove il bit finale viene usato per codificare la maschera alfa.

L'esempio di codice seguente illustra l'algoritmo per decidere se è selezionata la codifica a tre o quattro colori:

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;    

}

È consigliabile impostare i componenti RGBA del pixel di trasparenza su zero prima della fusione.

Le tabelle seguenti illustrano il layout di memoria per il blocco a 8 byte. Si presuppone che il primo indice corrisponda alla coordinata y e che il secondo corrisponda alla coordinata x. Ad esempio, Texel[1][2] fa riferimento al pixel della mappa delle texture in corrispondenza di (x,y) = (2,1).

Di seguito è riportato il layout di memoria per il blocco a 8 byte (64 bit):

Indirizzo word Parola a 16 bit
0 Color_0
1 Color_1
2 Bitmap Word_0
3 Bitmap Word_1

 

Color_0 e Color_1, i colori ai due estremi sono disposti come segue:

BITS Colore
4:0 (LSB*) Componente colore blu
10:5 Componente colore verde
15:11 Componente colore rosso

 

*Bit meno significativo

Bitmap Word_0 è disposto nel modo seguente:

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]

 

*bit più significativo (MSB)

Bitmap Word_1 è disposto nel modo seguente:

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]

 

Esempio di codifica dei colori opachi

Come esempio di codifica opaca, si suppone che i colori rosso e nero siano agli estremi. Il rosso è color_0 e il nero è color_1. Esistono quattro colori interpolati che formano la sfumatura distribuita in modo uniforme tra di esse. Per determinare i valori per la bitmap 4x4, vengono usati i calcoli seguenti:

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

La bitmap avrà quindi un aspetto simile al diagramma seguente.

Diagram of the expanded bitmap layout for Red and Black.

Questo aspetto è simile alla serie di colori illustrata di seguito.

Nota In un'immagine, pixel (0,0) viene visualizzato in alto a sinistra.

 

illustration of an opaque encoded gradient

Esempio di codifica alfa a 1 bit

Questo formato viene selezionato quando l'intero senza segno a 16 bit, color_0, è minore rispetto al valore intero senza segno a 16 bit, color_1. Un esempio di utilizzo di questo formato sono le foglie di un albero, sullo sfondo di un cielo blu. Alcuni texel possono essere contrassegnati come trasparenti, mentre tre sfumature di verde sono ancora disponibili per le foglie. Due colori fissano gli estremi e il terzo è un colore interpolato.

Nella figura seguente viene illustrato un esempio di un'immagine di questo tipo.

illustration of 1-bit alpha encoding

Dove l'immagine viene visualizzata come bianca, il texel viene codificato come trasparente. I componenti RGBA dei texel trasparenti devono essere impostati su zero prima della fusione.

La codifica bitmap per i colori e la trasparenza viene determinata usando i calcoli seguenti.

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

La bitmap avrà quindi un aspetto simile al diagramma seguente.

Diagram of the expanded bitmap layout for lighter green and darker green.

Risorse texture compresse