Delen via


Patronen met alfakanalen (Direct3D 9)

Er zijn twee manieren om patroonkaarten te coderen die complexere transparantie vertonen. In elk geval wordt een blok dat de transparantie beschrijft voorafgegaan door het 64-bits blok dat al is beschreven. De transparantie wordt weergegeven als een 4x4-bitmap met 4 bits per pixel (expliciete codering), of met minder bits en lineaire interpolatie die vergelijkbaar is met wat wordt gebruikt voor kleurcodering.

Het doorzichtigheidsblok en het kleurblok zijn gerangschikt zoals weergegeven in de volgende tabel.

Adres van Word 64-bits blok
3:0 Transparantieblok
7:4 Eerder beschreven 64-bits blok

 

Expliciete patrooncodering

Voor expliciete structuurcodering (DXT2- en DXT3-indelingen) worden de alfa-componenten van de texels die transparantie beschrijven, gecodeerd in een 4x4-bitmap met 4 bits per texel. Deze vier bits kunnen worden bereikt via verschillende middelen, zoals dithering of door de vier belangrijkste bits van de alfagegevens te gebruiken. Ze worden echter geproduceerd, ze worden net zo gebruikt als ze zijn, zonder enige vorm van interpolatie.

In het volgende diagram ziet u een 64-bits transparantieblok.

diagram van een 64-bits transparantieblok

Notitie

De compressiemethode van Direct3D maakt gebruik van de vier belangrijkste bits.

 

In de volgende tabellen ziet u hoe de alfa-informatie in het geheugen wordt ingedeeld, voor elk 16-bits woord.

Deze tabel bevat de indeling voor word 0.

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

 

*minst significante bit, meest significante bit (MSB)

Deze tabel bevat de indeling voor word 1.

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

 

Deze tabel bevat de indeling voor word 2.

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

 

Deze tabel bevat de indeling voor word 3.

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

 

Het verschil tussen DXT2 en DXT3 is dat in de DXT2-indeling wordt ervan uitgegaan dat de kleurgegevens vooraf door alfa zijn voorafgegaan. In de DXT3-indeling wordt ervan uitgegaan dat de kleur niet door alfa wordt voorafgegaan. Deze twee indelingen zijn nodig omdat in de meeste gevallen, wanneer een patroon wordt gebruikt, alleen de gegevens worden onderzocht, niet voldoende zijn om te bepalen of de kleurwaarden zijn vermenigvuldigd met alfa. Omdat deze informatie nodig is tijdens de uitvoering, worden de twee FOURCC-codes gebruikt om deze gevallen te onderscheiden. De gegevens- en interpolatiemethode die voor deze twee indelingen wordt gebruikt, is echter identiek.

De kleurvergelijking die in DXT1 wordt gebruikt om te bepalen of de texel transparant is, wordt niet gebruikt in deze indeling. Er wordt van uitgegaan dat zonder de kleur de kleurgegevens altijd worden behandeld alsof ze zich in de modus 4 kleuren bevinden. Met andere woorden: de if-instructie boven aan de DXT1-code moet het volgende zijn:

if ((color_0 > color_1) OR !DXT1) {

Three-Bit lineaire alfainterpolatie

De codering van transparantie voor de DXT4- en DXT5-indelingen is gebaseerd op een concept dat vergelijkbaar is met de lineaire codering die wordt gebruikt voor kleur. Twee 8-bits alfawaarden en een 4x4-bitmap met drie bits per pixel worden opgeslagen in de eerste acht bytes van het blok. De representatieve alfawaarden worden gebruikt om tussenliggende alfawaarden te interpoleren. Aanvullende informatie is beschikbaar op de manier waarop de twee alfawaarden worden opgeslagen. Als alpha_0 groter is dan alpha_1, worden er zes tussenliggende alfawaarden gemaakt door de interpolatie. Anders worden vier tussenliggende alfawaarden geïnterpoleerd tussen de opgegeven alfa-extremen. De twee extra impliciete alfawaarden zijn 0 (volledig transparant) en 255 (volledig ondoorzichtig).

In het volgende codevoorbeeld ziet u dit algoritme.

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

De geheugenindeling van het alfablok is als volgt:

Byte Alfa
0 Alpha_0
1 Alpha_1
2 [0][2] (2 MB's), [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 MB's), [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)

 

Het verschil tussen DXT4 en DXT5 is dat in de DXT4-indeling wordt ervan uitgegaan dat de kleurgegevens vooraf zijn gegaan door alfa. In de DXT5-indeling wordt ervan uitgegaan dat de kleur niet is voorafgegaan door alfa. Deze twee indelingen zijn nodig omdat in de meeste gevallen, wanneer een patroon wordt gebruikt, alleen de gegevens worden onderzocht, niet voldoende zijn om te bepalen of de kleurwaarden zijn vermenigvuldigd met alfa. Omdat deze informatie nodig is tijdens de uitvoering, worden de twee FOURCC-codes gebruikt om deze gevallen te onderscheiden. De gegevens- en interpolatiemethode die voor deze twee indelingen wordt gebruikt, is echter identiek.

De kleurvergelijking die in DXT1 wordt gebruikt om te bepalen of de texel transparant is, wordt niet gebruikt met deze notaties. Er wordt van uitgegaan dat zonder de kleur de kleurgegevens altijd worden behandeld alsof ze zich in de modus 4 kleuren bevinden. Met andere woorden: de if-instructie boven aan de DXT1-code moet het volgende zijn:

if ((color_0 > color_1) OR !DXT1) {

gecomprimeerde structuurbronnen