Delen via


Blokcompressie (Direct3D 10)

Blokcompressie is een patrooncompressietechniek voor het verminderen van de textuurgrootte. In vergelijking met een textuur met 32 bits per kleur kan een blokcompressiepatroon tot 75 procent kleiner zijn. Toepassingen zien meestal een prestatieverhoging bij het gebruik van blokcompressie vanwege de kleinere geheugenvoetafdruk.

Hoewel verlies, blokcompressie goed werkt en wordt aanbevolen voor alle patronen die worden getransformeerd en gefilterd door de pijplijn. Patronen die rechtstreeks zijn toegewezen aan het scherm (UI-elementen zoals pictogrammen en tekst) zijn geen goede keuzes voor compressie, omdat artefacten merkbaarder zijn.

Een blok-gecomprimeerd patroon moet worden gemaakt als een veelvoud van grootte 4 in alle dimensies en kan niet worden gebruikt als uitvoer van de pijplijn.

Hoe werkt blokcompressie?

Blokcompressie is een techniek voor het verminderen van de hoeveelheid geheugen die nodig is om kleurgegevens op te slaan. Door bepaalde kleuren op te slaan in de oorspronkelijke grootte en andere kleuren met behulp van een coderingsschema, kunt u de hoeveelheid geheugen die nodig is voor het opslaan van de afbeelding aanzienlijk verminderen. Omdat de hardware gecomprimeerde gegevens automatisch ontsleutelt, is er geen prestatiestraf voor het gebruik van gecomprimeerde patronen.

Bekijk de volgende twee voorbeelden om te zien hoe compressie werkt. In het eerste voorbeeld wordt de hoeveelheid geheugen beschreven die wordt gebruikt bij het opslaan van niet-gecomprimeerde gegevens; in het tweede voorbeeld wordt de hoeveelheid geheugen beschreven die wordt gebruikt bij het opslaan van gecomprimeerde gegevens.

Niet-gecomprimeerde gegevens opslaan

De volgende afbeelding vertegenwoordigt een niet-gecomprimeerd 4×4 patroon. Stel dat elke kleur één kleurcomponent (bijvoorbeeld rood) bevat en wordt opgeslagen in één byte van het geheugen.

illustratie van een niet-gecomprimeerd 4x4-patroon

De niet-gecomprimeerde gegevens worden opeenvolgend in het geheugen ingedeeld en vereisen 16 bytes, zoals wordt weergegeven in de volgende afbeelding.

illustratie van niet-gecomprimeerde gegevens in sequentiële

Gecomprimeerde gegevens opslaan

Nu u hebt gezien hoeveel geheugen een niet-gecomprimeerde afbeelding gebruikt, bekijkt u hoeveel geheugen een gecomprimeerde afbeelding opslaat. De BC4 compressie-indeling slaat 2 kleuren (1 byte elk) en 16 3-bits indexen (48 bits of 6 bytes) op die worden gebruikt om de oorspronkelijke kleuren in het patroon te interpoleren, zoals wordt weergegeven in de volgende afbeelding.

afbeelding van de indeling bc4-compressie

De totale ruimte die nodig is om de gecomprimeerde gegevens op te slaan, is 8 bytes. Dit is een geheugenbesparing van 50 procent ten opzichte van het niet-gecomprimeerde voorbeeld. De besparingen zijn zelfs groter wanneer meer dan één kleurcomponent wordt gebruikt.

De aanzienlijke geheugenbesparingen die worden geboden door blokcompressie kunnen leiden tot een toename van de prestaties. Deze prestaties komen ten koste van de beeldkwaliteit (vanwege kleurinterpolatie); de lagere kwaliteit is echter vaak niet merkbaar.

In de volgende sectie ziet u hoe Direct3D 10 u gemakkelijk blokcompressie in uw toepassing kunt gebruiken.

Blokcompressie gebruiken

Maak een blokgecompressiepatroon, net als een niet-gecomprimeerd patroon (zie Een patroon maken op basis van een bestand) behalve dat u een blok-gecomprimeerde indeling opgeeft.

loadInfo.Format = DXGI_FORMAT_BC1_UNORM;
D3DX10CreateTextureFromFile(...);

Maak vervolgens een weergave om het patroon aan de pijplijn te binden. Aangezien een blokgecompressiepatroon alleen kan worden gebruikt als invoer voor een shader-fase, wilt u een shader-resourceweergave maken door CreateShaderResourceView-aan te roepen.

Gebruik een gecomprimeerd blokpatroon op dezelfde manier als u een niet-gecomprimeerd patroon zou gebruiken. Als uw toepassing een geheugenpointer krijgt om gecomprimeerde gegevens te blokkeren, moet u rekening houden met de geheugenopvulling in een mipmap die ervoor zorgt dat de gedeclareerde grootte verschilt van de werkelijke grootte.

Virtuele grootte versus fysieke grootte

Als u toepassingscode hebt die gebruikmaakt van een geheugenpointer om het geheugen van een gecomprimeerd blokpatroon te doorlopen, is er een belangrijke overweging die mogelijk een wijziging in uw toepassingscode vereist. Een blok-gecomprimeerde textuur moet een veelvoud zijn van 4 in alle dimensies omdat de blokcompressiealgoritmen op 4x4 texelse blokken werken. Dit is een probleem voor een mipmap waarvan de initiële dimensies deelbaar zijn met 4, maar onderverdeelde niveaus niet. In het volgende diagram ziet u het verschil in gebied tussen de grootte van de virtuele (gedeclareerde) en de fysieke (werkelijke) grootte van elk mipmapniveau.

diagram van niet-gecomprimeerde en gecomprimeerde mipmapniveaus

Aan de linkerkant van het diagram ziet u de grootten op mipmapniveau die worden gegenereerd voor een niet-gecomprimeerd 60×40-patroon. De grootte op het hoogste niveau wordt genomen uit de API-aanroep waarmee het patroon wordt gegenereerd; elk volgend niveau is de helft van de grootte van het vorige niveau. Voor een niet-gecomprimeerde textuur is er geen verschil tussen de virtuele (gedeclareerde) grootte en de fysieke (werkelijke) grootte.

Aan de rechterkant van het diagram ziet u de grootten op mipmap-niveau die worden gegenereerd voor hetzelfde patroon van 60×40 met compressie. U ziet dat zowel de tweede als de derde niveaus geheugenopvulling hebben om de groottefactoren van 4 op elk niveau te maken. Dit is noodzakelijk zodat de algoritmen op 4×4 texelsblokken kunnen werken. Dit is duidelijk als u mipmapniveaus beschouwt die kleiner zijn dan 4×4; de grootte van deze zeer kleine mipmapniveaus wordt naar boven afgerond op de dichtstbijzijnde factor van 4 wanneer bitmapgeheugen wordt toegewezen.

Samplinghardware maakt gebruik van de virtuele grootte; wanneer het patroon wordt gemonsterd, wordt de geheugenopvulling genegeerd. Voor mipmapniveaus die kleiner zijn dan 4×4, worden alleen de eerste vier texels gebruikt voor een kaart van 2×2 en wordt alleen het eerste texelsblok gebruikt door een 1×1 blok. Er is echter geen API-structuur die de fysieke grootte beschikbaar maakt (inclusief de geheugenopvulling).

Kortom, wees voorzichtig met het gebruik van uitgelijnde geheugenblokken bij het kopiëren van regio's die gecomprimeerde gegevens bevatten. Als u dit wilt doen in een toepassing die een geheugenaanwijzer krijgt, moet u ervoor zorgen dat de aanwijzer de surfacepitch gebruikt om rekening te houden met de fysieke geheugengrootte.

Compressiealgoritmen

Compressietechnieken in Direct3D splitsen ongecomprimeerde patroongegevens op in 4×4 blokken, comprimeert elk blok en slaat de gegevens vervolgens op. Daarom moeten patronen die naar verwachting worden gecomprimeerd, structuurdimensies hebben die veelvouden van 4 zijn.

diagram van blokcompressie

In het voorgaande diagram ziet u een patroon dat is gepartitioneerd in Texelse blokken. Het eerste blok toont de indeling van de 16 texels met het label a-p, maar elk blok heeft dezelfde organisatie van gegevens.

Direct3D implementeert verschillende compressieschema's, elk implementeert een andere afweging tussen het aantal opgeslagen onderdelen, het aantal bits per onderdeel en de hoeveelheid verbruikt geheugen. Gebruik deze tabel om de indeling te kiezen die het beste werkt met het type gegevens en de gegevensomzetting die het beste bij uw toepassing past.

Brongegevens Resolutie van gegevenscompressie (in bits) Kies deze compressie-indeling
Driecomponentenkleur en alfa Kleur (5:6:5), Alfa (1) of geen alfa BC1
Driecomponentenkleur en alfa Kleur (5:6:5), Alfa (4) BC2-
Driecomponentenkleur en alfa Kleur (5:6:5), Alfa (8) BC3-
Kleur van één onderdeel Eén onderdeel (8) BC4-
Kleur van twee onderdelen Twee onderdelen (8:8) BC5-

 

BC1

Gebruik de eerste blokcompressie-indeling (BC1) (DXGI_FORMAT_BC1_TYPELESS, DXGI_FORMAT_BC1_UNORM of DXGI_BC1_UNORM_SRGB) om kleurgegevens van drie onderdelen op te slaan met een kleur van 5:6:5 (5 bits rood, 6 bits groen, 5 bits blauw). Dit geldt ook als de gegevens ook 1-bits alfa bevatten. Uitgaande van een 4×4-patroon met de grootste gegevensindeling, vermindert de BC1-indeling het geheugen dat nodig is van 48 bytes (16 kleuren × 3 onderdelen/kleur × 1 byte/component) tot 8 bytes geheugen.

Het algoritme werkt op 4×4 blokken texels. In plaats van 16 kleuren op te slaan, worden in het algoritme 2 referentiekleuren (color_0 en color_1) en 16 2-bits kleurenindexen (blokken a–p) opgeslagen, zoals wordt weergegeven in het volgende diagram.

diagram van de indeling voor bc1-compressie

De kleurindexen (a–p) worden gebruikt om de oorspronkelijke kleuren van een kleurentabel op te zoeken. De kleurentabel bevat vier kleuren. De eerste twee kleuren( color_0 en color_1) zijn de minimum- en maximumkleuren. De andere twee kleuren, color_2 en color_3, zijn tussenliggende kleuren die worden berekend met lineaire interpolatie.

color_2 = 2/3*color_0 + 1/3*color_1
color_3 = 1/3*color_0 + 2/3*color_1

De vier kleuren worden 2-bits indexwaarden toegewezen die worden opgeslagen in blokken a–p.

color_0 = 00
color_1 = 01
color_2 = 10
color_3 = 11

Ten slotte worden alle kleuren in blokken a–p vergeleken met de vier kleuren in de kleurentabel en wordt de index voor de dichtstbijzijnde kleur opgeslagen in de 2-bits blokken.

Dit algoritme leent zich ook voor gegevens die 1-bits alfa bevatten. Het enige verschil is dat color_3 is ingesteld op 0 (die een transparante kleur vertegenwoordigt) en color_2 een lineaire combinatie van color_0 en color_1 is.

color_2 = 1/2*color_0 + 1/2*color_1;
color_3 = 0;

verschillen tussen Direct3D 9 en Direct3D 10:

Deze indeling bestaat in zowel Direct3D 9 als 10.

  • In Direct3D 9wordt de BC1-indeling D3DFMT_DXT1genoemd.
  • In Direct3D 10wordt de BC1-indeling vertegenwoordigd door DXGI_FORMAT_BC1_UNORM of DXGI_FORMAT_BC1_UNORM_SRGB.

BC2

Gebruik de BC2-indeling (DXGI_FORMAT_BC2_TYPELESS, DXGI_FORMAT_BC2_UNORM of DXGI_BC2_UNORM_SRGB) om gegevens op te slaan die kleur- en alfagegevens bevatten met een lage samenhang (gebruik BC3- voor zeer coherente alfagegevens). De BC2-indeling slaat RGB-gegevens op als een 5:6:5-kleur (5 bits rood, 6 bits groen, 5 bits blauw) en alfa als een afzonderlijke 4-bits waarde. Uitgaande van een 4×4-patroon met de grootste gegevensindeling, vermindert deze compressietechniek het geheugen dat nodig is van 64 bytes (16 kleuren × 4 onderdelen/kleur × 1 byte/component) tot 16 bytes geheugen.

De BC2-indeling slaat kleuren op met hetzelfde aantal bits en gegevensindeling als de BC1-indeling; BC2 vereist echter een extra 64 bits geheugen voor het opslaan van de alfagegevens, zoals wordt weergegeven in het volgende diagram.

diagram van de indeling voor bc2-compressie

verschillen tussen Direct3D 9 en Direct3D 10:

Deze indeling bestaat in zowel Direct3D 9 als 10.

  • In Direct3D 9-wordt de BC2-indeling D3DFMT_DXT2 en D3DFMT_DXT3genoemd.

  • In Direct3D 10wordt de BC2-indeling vertegenwoordigd door DXGI_FORMAT_BC2_UNORM of DXGI_FORMAT_BC2_UNORM_SRGB

BC3

Gebruik de BC3-indeling (DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_BC3_UNORM of DXGI_BC3_UNORM_SRGB) om zeer coherente kleurgegevens op te slaan (gebruik BC2 met minder coherente alfagegevens). In de BC3-indeling worden kleurgegevens opgeslagen met 5:6:5 kleur (5 bits rood, 6 bits groen, 5 bits blauw) en alfagegevens met één byte. Uitgaande van een 4×4-patroon met de grootste gegevensindeling, vermindert deze compressietechniek het geheugen dat nodig is van 64 bytes (16 kleuren × 4 onderdelen/kleur × 1 byte/component) tot 16 bytes geheugen.

De BC3-indeling slaat kleuren op met hetzelfde aantal bits en gegevensindeling als de BC1-indeling; BC3 vereist echter een extra geheugen van 64 bits om de alfagegevens op te slaan. De BC3-indeling verwerkt alfa door twee verwijzingswaarden op te slaan en ertussen te interpoleren (vergelijkbaar met de manier waarop BC1 RGB-kleur opslaat).

Het algoritme werkt op 4×4 blokken texels. In plaats van 16 alfawaarden op te slaan, slaat het algoritme 2 verwijzings alfa's (alpha_0 en alpha_1) en 16 3-bits kleurindexen (alfa a tot en met p) op, zoals wordt weergegeven in het volgende diagram.

diagram van de indeling voor bc3-compressie

De BC3-indeling gebruikt de alfa-indexen (a–p) om de oorspronkelijke kleuren op te zoeken uit een opzoektabel die 8 waarden bevat. De eerste twee waarden, alpha_0 en alpha_1, zijn de minimum- en maximumwaarden; de andere zes tussenliggende waarden worden berekend met behulp van lineaire interpolatie.

Het algoritme bepaalt het aantal geïnterpoleerde alfawaarden door de twee referentie alfawaarden te onderzoeken. Als alpha_0 groter is dan alpha_1, interpoleert BC3 6 alfawaarden; anders interpoleert het 4. Wanneer BC3 slechts 4 alfawaarden interpoleert, worden er twee extra alfawaarden ingesteld (0 voor volledig transparant en 255 voor volledig ondoorzichtig). BC3 comprimeert de alfawaarden in het 4×4 texelsgebied door de bitcode op te slaan die overeenkomt met de geïnterpoleerde alfawaarden die het meest overeenkomen met de oorspronkelijke alfa voor een gegeven texel.

if( alpha_0 > alpha_1 )
{
  // 6 interpolated alpha values.
  alpha_2 = 6/7*alpha_0 + 1/7*alpha_1; // bit code 010
  alpha_3 = 5/7*alpha_0 + 2/7*alpha_1; // bit code 011
  alpha_4 = 4/7*alpha_0 + 3/7*alpha_1; // bit code 100
  alpha_5 = 3/7*alpha_0 + 4/7*alpha_1; // bit code 101
  alpha_6 = 2/7*alpha_0 + 5/7*alpha_1; // bit code 110
  alpha_7 = 1/7*alpha_0 + 6/7*alpha_1; // bit code 111
}
else
{
  // 4 interpolated alpha values.
  alpha_2 = 4/5*alpha_0 + 1/5*alpha_1; // bit code 010
  alpha_3 = 3/5*alpha_0 + 2/5*alpha_1; // bit code 011
  alpha_4 = 2/5*alpha_0 + 3/5*alpha_1; // bit code 100
  alpha_5 = 1/5*alpha_0 + 4/5*alpha_1; // bit code 101
  alpha_6 = 0;                         // bit code 110
  alpha_7 = 255;                       // bit code 111
}

verschillen tussen Direct3D 9 en Direct3D 10:

  • In Direct3D 9-wordt de BC3-indeling D3DFMT_DXT4 en D3DFMT_DXT5genoemd.

  • In Direct3D 10wordt de BC3-indeling vertegenwoordigd door DXGI_FORMAT_BC3_UNORM of DXGI_FORMAT_BC3_UNORM_SRGB.

BC4

Gebruik de BC4-indeling om kleurgegevens met één component op te slaan met 8 bits voor elke kleur. Als gevolg van de toegenomen nauwkeurigheid (vergeleken met BC1), is BC4 ideaal voor het opslaan van drijvende-kommagegevens in het bereik van [0 tot 1] met behulp van de DXGI_FORMAT_BC4_UNORM-indeling en [-1 tot +1] met behulp van de DXGI_FORMAT_BC4_SNORM-indeling. Uitgaande van een 4×4-patroon met behulp van de grootste gegevensindeling, vermindert deze compressietechniek het geheugen dat nodig is van 16 bytes (16 kleuren × 1 onderdelen/kleur × 1 byte/component) tot 8 bytes.

Het algoritme werkt op 4×4 blokken texels. In plaats van 16 kleuren op te slaan, worden in het algoritme 2 referentiekleuren (red_0 en red_1) en 16 3-bits kleurenindexen (rood a tot en met rode p) opgeslagen, zoals wordt weergegeven in het volgende diagram.

diagram van de indeling voor bc4-compressie

Het algoritme gebruikt de 3-bits indexen om kleuren op te zoeken uit een kleurentabel die 8 kleuren bevat. De eerste twee kleuren, red_0 en red_1, zijn de minimum- en maximumkleuren. Het algoritme berekent de resterende kleuren met behulp van lineaire interpolatie.

Het algoritme bepaalt het aantal geïnterpoleerde kleurwaarden door de twee referentiewaarden te onderzoeken. Als red_0 groter is dan red_1, interpoleert BC4 6 kleurwaarden; anders interpoleert het 4. Wanneer BC4 slechts 4 kleurwaarden interpoleert, worden er twee extra kleurwaarden ingesteld (0,0f voor volledig transparant en 1,0f voor volledig ondoorzichtig). BC4 comprimeert de alfawaarden in het 4×4 texelsgebied door de bitcode op te slaan die overeenkomt met de geïnterpoleerde alfawaarden die het meest overeenkomen met de oorspronkelijke alfa voor een gegeven texel.

BC4_UNORM

De interpolatie van de gegevens met één component wordt uitgevoerd zoals in het volgende codevoorbeeld.

unsigned word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = 0.0f;                     // bit code 110
  red_7 = 1.0f;                     // bit code 111
}

Aan de referentiekleuren worden 3-bits indexen toegewezen (000-111 omdat er 8 waarden zijn), die worden opgeslagen in blokken rood a tot en met rode p tijdens compressie.

BC4_SNORM

De DXGI_FORMAT_BC4_SNORM is precies hetzelfde, behalve dat de gegevens zijn gecodeerd in het SNORM-bereik en wanneer 4 kleurwaarden worden geïnterpoleerd. De interpolatie van de gegevens met één component wordt uitgevoerd zoals in het volgende codevoorbeeld.

signed word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = -1.0f;                     // bit code 110
  red_7 =  1.0f;                     // bit code 111
}

Aan de referentiekleuren worden 3-bits indexen toegewezen (000-111 omdat er 8 waarden zijn), die worden opgeslagen in blokken rood a tot en met rode p tijdens compressie.

BC5

Gebruik de BC5-indeling om kleurgegevens van twee onderdelen op te slaan met 8 bits voor elke kleur. Als gevolg van de verhoogde nauwkeurigheid (vergeleken met BC1), is BC5 ideaal voor het opslaan van drijvende-kommagegevens in het bereik van [0 tot 1] met behulp van de DXGI_FORMAT_BC5_UNORM-indeling en [-1 tot +1] met behulp van de DXGI_FORMAT_BC5_SNORM-indeling. Ervan uitgaande dat een 4×4-patroon met de grootste gegevensindeling mogelijk is, vermindert deze compressietechniek het geheugen dat nodig is van 32 bytes (16 kleuren × 2 onderdelen/kleur × 1 byte/component) tot 16 bytes.

Het algoritme werkt op 4×4 blokken texels. In plaats van 16 kleuren voor beide onderdelen op te slaan, slaat het algoritme 2 referentiekleuren op voor elk onderdeel (red_0, red_1, green_0 en green_1) en 16 3-bits kleurindexen voor elk onderdeel (rood a tot en met rood p en groen a tot en met groene p), zoals wordt weergegeven in het volgende diagram.

diagram van de indeling voor bc5-compressie

Het algoritme gebruikt de 3-bits indexen om kleuren op te zoeken uit een kleurentabel die 8 kleuren bevat. De eerste twee kleuren ( red_0 en red_1 (of green_0 en green_1)) zijn de minimum- en maximumkleuren. Het algoritme berekent de resterende kleuren met behulp van lineaire interpolatie.

Het algoritme bepaalt het aantal geïnterpoleerde kleurwaarden door de twee referentiewaarden te onderzoeken. Als red_0 groter is dan red_1, interpoleert BC5 6 kleurwaarden; anders interpoleert het 4. Wanneer BC5 slechts 4 kleurwaarden interpoleert, worden de resterende twee kleurwaarden ingesteld op 0,0f en 1,0f.

BC5_UNORM

De interpolatie van de gegevens met één component wordt uitgevoerd zoals in het volgende codevoorbeeld. De berekeningen voor de groene componenten zijn vergelijkbaar.

unsigned word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = 0.0f;                     // bit code 110
  red_7 = 1.0f;                     // bit code 111
}

Aan de referentiekleuren worden 3-bits indexen toegewezen (000-111 omdat er 8 waarden zijn), die worden opgeslagen in blokken rood a tot en met rode p tijdens compressie.

BC5_SNORM

De DXGI_FORMAT_BC5_SNORM is precies hetzelfde, behalve dat de gegevens zijn gecodeerd in het SNORM-bereik en wanneer 4 gegevenswaarden zijn geïnterpoleerd, zijn de twee extra waarden -1,0f en 1,0f. De interpolatie van de gegevens met één component wordt uitgevoerd zoals in het volgende codevoorbeeld. De berekeningen voor de groene componenten zijn vergelijkbaar.

signed word red_0, red_1;

if( red_0 > red_1 )
{
  // 6 interpolated color values
  red_2 = (6*red_0 + 1*red_1)/7.0f; // bit code 010
  red_3 = (5*red_0 + 2*red_1)/7.0f; // bit code 011
  red_4 = (4*red_0 + 3*red_1)/7.0f; // bit code 100
  red_5 = (3*red_0 + 4*red_1)/7.0f; // bit code 101
  red_6 = (2*red_0 + 5*red_1)/7.0f; // bit code 110
  red_7 = (1*red_0 + 6*red_1)/7.0f; // bit code 111
}
else
{
  // 4 interpolated color values
  red_2 = (4*red_0 + 1*red_1)/5.0f; // bit code 010
  red_3 = (3*red_0 + 2*red_1)/5.0f; // bit code 011
  red_4 = (2*red_0 + 3*red_1)/5.0f; // bit code 100
  red_5 = (1*red_0 + 4*red_1)/5.0f; // bit code 101
  red_6 = -1.0f;                    // bit code 110
  red_7 =  1.0f;                    // bit code 111
}

Aan de referentiekleuren worden 3-bits indexen toegewezen (000-111 omdat er 8 waarden zijn), die worden opgeslagen in blokken rood a tot en met rode p tijdens compressie.

Conversie opmaken met Direct3D 10.1

Direct3D 10.1 maakt kopieën mogelijk tussen vooraf gestructureerde patronen en blok-gecomprimeerde patronen van dezelfde bitbreedte. De functies die dit kunnen bereiken, zijn CopyResource- en CopySubresourceRegion.

Vanaf Direct3D 10.1 kunt u CopyResource- en CopySubresourceRegion gebruiken om te kopiëren tussen een paar indelingstypen. Met dit type kopieerbewerking wordt een type indelingsconversie uitgevoerd waarmee resourcegegevens opnieuw worden geïnterpreteerd als een ander indelingstype. Bekijk dit voorbeeld waarin het verschil wordt weergegeven tussen het opnieuw interpreteren van gegevens met de manier waarop een meer typisch type conversie zich gedraagt:

    FLOAT32 f = 1.0f;
    UINT32 u;

Als u 'f' opnieuw wilt interpreteren als het type 'u', gebruikt u memcpy:

    memcpy( &u, &f, sizeof( f ) ); // ‘u’ becomes equal to 0x3F800000.

In de voorgaande herinterpretatie verandert de onderliggende waarde van de gegevens niet; memcpy herinterpreteert de float als een geheel getal zonder teken.

Als u het meest typische type conversie wilt uitvoeren, gebruikt u de toewijzing:

    u = f; // ‘u’ becomes 1.

In de voorgaande conversie wordt de onderliggende waarde van de gegevens gewijzigd.

De volgende tabel bevat de toegestane bron- en doelindelingen die u kunt gebruiken in dit type herinterpretatie van indelingsconversie. U moet de waarden correct coderen om de herinterpretatie naar behoren te laten werken.

Bitbreedte Niet-gecomprimeerde resource Block-Compressed-resource
32 DXGI_FORMAT_R32_UINT
DXGI_FORMAT_R32_SINT
DXGI_FORMAT_R9G9B9E5_SHAREDEXP
64 DXGI_FORMAT_R16G16B16A16_UINT
DXGI_FORMAT_R16G16B16A16_SINT
DXGI_FORMAT_R32G32_UINT
DXGI_FORMAT_R32G32_SINT
DXGI_FORMAT_BC1_UNORM[_SRGB]
DXGI_FORMAT_BC4_UNORM
DXGI_FORMAT_BC4_SNORM
128 DXGI_FORMAT_R32G32B32A32_UINT
DXGI_FORMAT_R32G32B32A32_SINT
DXGI_FORMAT_BC2_UNORM[_SRGB]
DXGI_FORMAT_BC3_UNORM[_SRGB]
DXGI_FORMAT_BC5_UNORM
DXGI_FORMAT_BC5_SNORM

 

Resources (Direct3D 10)