Condividi tramite


Trame 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.

diagram of a 64-bit transparency block

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