Texture con canali alfa

Esistono due modi per codificare le mappe di texture che presentano trasparenza più complessa. In ogni caso, un blocco che descrive la trasparenza precede il blocco a 64 bit già descritto. La trasparenza è rappresentata come bitmap 4x4 con 4 bit per pixel (codifica esplicita) o con un minor numero di bit e interpolazione lineare analoga a quella usata per la codifica dei colori.

Il blocco di trasparenza e il blocco di colori sono disposti come illustrato nella tabella seguente.

Indirizzo word Blocco di 64 bit
3:0 Blocco trasparenza
7:4 Blocco a 64 bit descritto in precedenza

Codifica esplicita delle texture

Per la codifica esplicita delle texture (formato BC2), i componenti alfa dei texel che descrivono la trasparenza vengono codificati in una bitmap 4x4 con 4 bit per texel. Questi quattro bit possono essere ottenuti tramite un'ampia gamma di mezzi, ad esempio dithering o usando i quattro bit più significativi dei dati alfa. Tuttavia vengono prodotti e vengono usati proprio come sono, senza alcuna forma di interpolazione.

Il diagramma seguente mostra un blocco di trasparenza a 64 bit.

diagramma di un blocco di trasparenza a 64 bit

Nota Il metodo di compressione di Direct3D usa i quattro bit più significativi.

 

Le tabelle successive illustrano come vengono disposte le informazioni alfa in memoria per ogni parola a 16 bit.

Layout per word 0:

BITS Alfa
3:0 (LSB*) [0][0]
7:4 [0][1]
11:8 [0][2]
15:12 (MSB*) [0][3]

 

*bit meno significativo, bit più significativo (MSB)

Layout per word 1:

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

 

Layout per word 2:

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

 

Layout per word 3:

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

 

Il confronto dei colori usato in BC1 per determinare se il texel è trasparente non viene usato in questo formato. Si presuppone che senza il colore, il confronto dei dati di colore viene sempre considerato come se fosse in modalità a 4 colori.

Interpolazione alfa lineare a tre bit

La codifica della trasparenza per il formato BC3 si basa su un concetto simile alla codifica lineare usata per il colore. Due valori alfa a 8 bit e una bitmap 4x4 con tre bit per pixel vengono archiviati nei primi otto byte del blocco. I valori alfa rappresentativi vengono usati per interpolare i valori alfa intermedi. Sono disponibili informazioni aggiuntive nel modo in cui vengono archiviati i due valori alfa. Se alpha_0 è maggiore di alpha_1, vengono creati sei valori alfa intermedi dall'interpolazione. In caso contrario, quattro valori alfa intermedi vengono interpolati tra gli estremi alfa specificati. I due valori alfa impliciti aggiuntivi sono 0 (completamente trasparente) e 255 (completamente opaco).

Il seguente esempio di codice illustra questo algoritmo.

// 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
}

Il layout di memoria del blocco alfa è il seguente:

Byte Alfa
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)

 

Il confronto dei colori usato in BC1 per determinare se il texel è trasparente non viene usato con questi formati. Si presuppone che senza il colore, il confronto dei dati di colore viene sempre considerato come se fosse in modalità a 4 colori.

Risorse texture compresse