Sdílet prostřednictvím


Komprese bloků (Direct3D 10)

Komprese bloků je technika komprese textury pro zmenšení velikosti textury. Ve srovnání s texturou s 32 bity na barvu může být textura komprimovaná blokem až o 75 procent menší. Aplikace obvykle při použití komprese bloků vidí zvýšení výkonu kvůli menšímu využití paměti.

Při ztrátě funguje komprese bloků dobře a doporučuje se pro všechny textury, které se transformují a filtrují kanálem. Textury, které jsou přímo namapované na obrazovku (prvky uživatelského rozhraní, jako jsou ikony a text), nejsou dobrou volbou pro kompresi, protože artefakty jsou výraznější.

Textura komprimovaná blokem musí být vytvořena jako násobek velikosti 4 ve všech dimenzích a nelze ji použít jako výstup kanálu.

Jak funguje komprese bloků?

Komprese bloků je technika pro snížení množství paměti potřebné k ukládání barevných dat. Uložením některých barev do původní velikosti a dalších barev pomocí schématu kódování můžete výrazně snížit množství paměti potřebné k uložení obrázku. Vzhledem k tomu, že hardware automaticky dekóduje komprimovaná data, neexistuje žádný trest výkonu při použití komprimovaných textur.

Pokud chcete zjistit, jak komprese funguje, podívejte se na následující dva příklady. První příklad popisuje množství paměti použité při ukládání nekomprimovaných dat; Druhý příklad popisuje množství paměti použité při ukládání komprimovaných dat.

Ukládání nekomprimovaných dat

Následující obrázek představuje nekomprimovanou texturu 4×4. Předpokládejme, že každá barva obsahuje jednu barevnou komponentu (například červenou) a je uložena v jednom bajtu paměti.

ilustrace nekomprimované textury 4x4

Nekomprimovaná data jsou rozložena v paměti postupně a vyžadují 16 bajtů, jak je znázorněno na následujícím obrázku.

ilustrace nekomprimovaných dat v sekvenční paměti

Ukládání komprimovaných dat

Teď, když jste viděli, kolik paměti nekomprimovaný obrázek používá, podívejte se, kolik paměti komprimovaný obrázek ukládá. Formát komprese BC4 ukládá 2 barvy (každý 1 bajt) a 16 3bitových indexů (48 bitů nebo 6 bajtů), které se používají k interpolaci původních barev v texturě, jak je znázorněno na následujícím obrázku.

ilustrace formátu komprese bc4

Celkový prostor potřebný k uložení komprimovaných dat je 8 bajtů, což je 50procentní úspora paměti oproti nekomprimovanému příkladu. Úspory jsou ještě větší, když se použije více než jedna barevná komponenta.

Výrazné úspory paměti poskytované kompresí bloků můžou vést ke zvýšení výkonu. Tento výkon má náklady na kvalitu obrazu (kvůli interpolaci barev); nižší kvalita však často není patrná.

V další části se dozvíte, jak direct3D 10 usnadňuje použití blokové komprese v aplikaci.

Použití komprese bloků

Vytvořte texturu komprimovanou blokem stejně jako nekomprimovanou texturu (viz Vytvoření textury ze souboru) s tím rozdílem, že zadáte formát komprimovaný blok.

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

Dále vytvořte zobrazení pro vazbu textury s kanálem. Vzhledem k tomu, že blok komprimovanou texturu lze použít pouze jako vstup do fáze shaderu, chcete vytvořit zobrazení shader-prostředek voláním CreateShaderResourceView.

Použijte blok komprimovanou texturu stejným způsobem, jako byste použili nekomprimovanou texturu. Pokud vaše aplikace získá ukazatel paměti na blokovaná komprimovaná data, musíte zohlednit odsazení paměti v mipmapě, která způsobí, že deklarovaná velikost se liší od skutečné velikosti.

Virtuální velikost versus fyzická velikost

Pokud máte kód aplikace, který používá ukazatel paměti pro procházku paměti blok komprimované textury, existuje jeden důležitý faktor, který může vyžadovat změnu v kódu aplikace. Textura komprimovaná blokem musí být ve všech dimenzích násobkem 4, protože algoritmy komprese bloků pracují s bloky texelu 4x4. To bude problém pro mipmap, jehož počáteční dimenze jsou dělitelné 4, ale dílčí úrovně nejsou. Následující diagram znázorňuje rozdíl v oblasti mezi virtuální (deklarovanou) velikostí a fyzickou (skutečnou) velikostí každé úrovně mapy mipmap.

diagram nekomprimovaných a komprimovaných úrovní mipmap

Levá strana diagramu zobrazuje velikosti na úrovni mipmap, které se generují pro nekomprimovanou texturu 60×40. Velikost nejvyšší úrovně je převzata z volání rozhraní API, které generuje texturu; každá další úroveň je poloviční velikost předchozí úrovně. U nekomprimované textury neexistuje žádný rozdíl mezi virtuální (deklarovanou) velikostí a fyzickou (skutečnou) velikostí.

Pravá strana diagramu zobrazuje velikosti na úrovni mipmap, které se generují pro stejnou texturu 60×40 s kompresí. Všimněte si, že obě druhé i třetí úrovně mají odsazení paměti, aby se faktory velikosti 4 na každé úrovni. To je nezbytné, aby algoritmy mohly pracovat se 4×4 bloky texelu. To je expecialně zřejmé, pokud uvažujete o úrovních mipmap, které jsou menší než 4×4; velikost těchto velmi malých úrovní mipmap bude zaokrouhleno nahoru na nejbližší faktor 4 při přidělení texturové paměti.

Vzorkování hardwaru používá virtuální velikost; při vzorkování textury se odsazení paměti ignoruje. U úrovní mipmap, které jsou menší než 4×4, budou pro mapu 2×2 použity pouze první čtyři texely a pouze první texel bude používán blokem 1×1. Neexistuje však žádná struktura rozhraní API, která zpřístupňuje fyzickou velikost (včetně odsazení paměti).

V souhrnu dávejte pozor, abyste při kopírování oblastí, které obsahují blokovaná data, používali zarovnané bloky paměti. Chcete-li to provést v aplikaci, která získá ukazatel paměti, ujistěte se, že ukazatel používá výšku povrchu k zohlednění fyzické velikosti paměti.

Algoritmy komprese

Techniky komprese bloků v Direct3D rozdělí nekomprimovaná data textury do 4×4 bloků, zkomprimují každý blok a pak uloží data. Z tohoto důvodu musí mít textury, které mají být komprimovány, rozměry textury, které jsou násobky 4.

diagramu komprese bloků

Předchozí diagram znázorňuje texturu rozdělenou na bloky texelu. První blok ukazuje rozložení 16 texelů označených jako p, ale každý blok má stejnou organizaci dat.

Direct3D implementuje několik schémat komprese, každá implementuje jiný kompromis mezi počtem uložených komponent, počtem bitů na komponentu a množstvím spotřebované paměti. Tato tabulka vám pomůže zvolit formát, který nejlépe vyhovuje typu dat a rozlišení dat, které nejlépe vyhovuje vaší aplikaci.

Zdrojová data Rozlišení komprese dat (v bitech) Zvolte tento formát komprese.
Třísložková barva a alfa Barva (5:6:5), Alfa (1) nebo žádná alfa BC1
Třísložková barva a alfa Barva (5:6:5), Alfa (4) BC2
Třísložková barva a alfa Barva (5:6:5), Alfa (8) BC3
Barva jedné komponenty Jedna součást (8) BC4
Dvousložková barva Dvě komponenty (8:8) BC5

 

BC1

První formát komprese bloku (BC1) (DXGI_FORMAT_BC1_TYPELESS, DXGI_FORMAT_BC1_UNORM nebo DXGI_BC1_UNORM_SRGB) použijte k uložení třísložkového barevného data pomocí barvy 5:6:5 (5 bitů červené, 6 bitů zelené, 5 bitů modré). To platí i v případě, že data obsahují také 1bitovou alfa. Za předpokladu, že textura 4×4 používá největší možný formát dat, zmenší formát BC1 paměť požadovanou z 48 bajtů (16 barev × 3 součásti/barva × 1 bajty/komponenta) na 8 bajtů paměti.

Algoritmus funguje na 4×4 blocích texelů. Místo uložení 16 barev algoritmus ukládá 2 referenční barvy (color_0 a color_1) a 16 2bitových barevných indexů (bloků a–p), jak je znázorněno v následujícím diagramu.

diagramu rozložení komprese bc1

Indexy barev (a–p) slouží k vyhledání původních barev z barevné tabulky. Tabulka barev obsahuje 4 barvy. První dvě barvy – color_0 a color_1 – jsou minimální a maximální barvy. Další dvě barvy, color_2 a color_3, jsou přechodné barvy vypočítané lineární interpolací.

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

Čtyři barvy jsou přiřazeny 2bitové hodnoty indexu, které budou uloženy v blocích a–p.

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

Nakonec se všechny barvy v blocích a–p porovnávají se čtyřmi barvami v tabulce barev a index nejbližší barvy se uloží do 2bitových bloků.

Tento algoritmus se také hodí k datům, která obsahují 1bitovou alfa. Jediným rozdílem je, že color_3 je nastavena na 0 (což představuje průhlednou barvu) a color_2 je lineární směs color_0 a color_1.

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

rozdíly mezi Direct3D 9 a Direct3D 10:

Tento formát existuje v Direct3D 9 i 10.

  • V Direct3D 9se formát BC1 nazývá D3DFMT_DXT1.
  • V Direct3D 10je formát BC1 reprezentován DXGI_FORMAT_BC1_UNORM nebo DXGI_FORMAT_BC1_UNORM_SRGB.

BC2

Pomocí formátu BC2 (DXGI_FORMAT_BC2_TYPELESS, DXGI_FORMAT_BC2_UNORM nebo DXGI_BC2_UNORM_SRGB) můžete ukládat data obsahující barvy a alfa data s nízkou koherencem (pro vysoce koherentní alfa data použijte BC3). Formát BC2 ukládá data RGB jako barvu 5:6:5 (5 bitů červené, 6 bitů zelené, 5 bitů modré) a alfa jako samostatnou 4bitovou hodnotu. Za předpokladu, že textura 4×4 používá největší možný formát dat, tato technika komprese snižuje paměť vyžadovanou z 64 bajtů (16 barev × 4 komponenty/barva × 1 bajt/komponenta) na 16 bajtů paměti.

Formát BC2 ukládá barvy se stejným počtem bitů a rozložení dat jako formát BC1; BC2 však k uložení alfa dat vyžaduje dalších 64 bitů paměti, jak je znázorněno v následujícím diagramu.

diagramu rozložení komprese bc2

rozdíly mezi Direct3D 9 a Direct3D 10:

Tento formát existuje v Direct3D 9 i 10.

  • V Direct3D 9se formát BC2 nazývá D3DFMT_DXT2 a D3DFMT_DXT3.

  • V Direct3D 10je formát BC2 reprezentován DXGI_FORMAT_BC2_UNORM nebo DXGI_FORMAT_BC2_UNORM_SRGB

BC3

K ukládání vysoce koherentních barevných dat použijte formát BC3 (DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_BC3_UNORM nebo DXGI_BC3_UNORM_SRGB). Formát BC3 ukládá barevná data pomocí barvy 5:6:5 (5 bitů červené, 6 bitů zelené, 5 bitů modré) a alfa dat pomocí jednoho bajtu. Za předpokladu, že textura 4×4 používá největší možný formát dat, tato technika komprese snižuje paměť vyžadovanou z 64 bajtů (16 barev × 4 komponenty/barva × 1 bajt/komponenta) na 16 bajtů paměti.

Formát BC3 ukládá barvy se stejným počtem bitů a rozložení dat jako formát BC1; BC3 však k uložení alfa dat vyžaduje další 64bitovou paměť. Formát BC3 zpracovává alfa uložením dvou referenčních hodnot a interpolací mezi nimi (podobně jako bc1 ukládá barvu RGB).

Algoritmus funguje na 4×4 blocích texelů. Místo uložení 16 alfa hodnot ukládá algoritmus 2 referenční alfa (alpha_0 a alpha_1) a 16 3bitových indexů barev (alfa a až p), jak je znázorněno v následujícím diagramu.

diagramu rozložení komprese bc3

Formát BC3 používá alfa indexy (a–p) k vyhledání původních barev z vyhledávací tabulky, která obsahuje 8 hodnot. První dvě hodnoty – alpha_0 a alpha_1 – jsou minimální a maximální hodnoty; dalších šest zprostředkujících hodnot se vypočítá pomocí lineární interpolace.

Algoritmus určuje počet interpolovaných alfa hodnot prozkoumáním dvou referenčních alfa hodnot. Pokud je alpha_0 větší než alpha_1, pak BC3 interpoluje 6 alfa hodnot; jinak interpoluje 4. Když BC3 interpoluje pouze 4 alfa hodnoty, nastaví dvě další alfa hodnoty (0 pro plně průhledné a 255 pro plně neprůhledné). BC3 komprimuje alfa hodnoty v oblasti 4×4 texel uložením bitového kódu odpovídajícího interpolovaným alfa hodnotám, které nejvíce odpovídají původnímu alfa pro daný 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
}

rozdíly mezi Direct3D 9 a Direct3D 10:

  • V Direct3D 9se formát BC3 nazývá D3DFMT_DXT4 a D3DFMT_DXT5.

  • V Direct3D 10je formát BC3 reprezentován DXGI_FORMAT_BC3_UNORM nebo DXGI_FORMAT_BC3_UNORM_SRGB.

BC4

Formát BC4 slouží k ukládání barevných dat jedné součásti pomocí 8 bitů pro každou barvu. V důsledku zvýšené přesnosti (ve srovnání s BC1) je BC4 ideální pro ukládání dat s plovoucí desetinnou čárkou v rozsahu [0 až 1] pomocí formátu DXGI_FORMAT_BC4_UNORM a [-1 až +1] pomocí formátu DXGI_FORMAT_BC4_SNORM. Za předpokladu, že textura 4×4 používá největší možný formát dat, tato technika komprese snižuje paměť vyžadovanou z 16 bajtů (16 barev × 1 součásti/barva × 1 bajt/komponenta) na 8 bajtů.

Algoritmus funguje na 4×4 blocích texelů. Místo uložení 16 barev algoritmus ukládá 2 referenční barvy (red_0 a red_1) a 16 3bitových barevných indexů (červené a až červené p), jak je znázorněno v následujícím diagramu.

diagramu rozložení komprese bc4

Algoritmus používá 3bitové indexy k vyhledání barev z barevné tabulky, která obsahuje 8 barev. První dvě barvy – red_0 a red_1 – jsou minimální a maximální barvy. Algoritmus vypočítá zbývající barvy pomocí lineární interpolace.

Algoritmus určuje počet interpolovaných barevných hodnot prozkoumáním dvou referenčních hodnot. Pokud je red_0 větší než red_1, pak BC4 interpoluje 6 barevných hodnot; jinak interpoluje 4. Když BC4 interpoluje pouze 4 barevné hodnoty, nastaví dvě další barevné hodnoty (0,0f pro plně průhledné a 1,0f pro plně neprůhledné). BC4 komprimuje alfa hodnoty v oblasti 4×4 texel uložením bitového kódu odpovídajícího interpolovaným alfa hodnotám, které nejvíce odpovídají původní alfa pro daný texel.

BC4_UNORM

Interpolace dat s jednou komponentou se provádí stejně jako v následující ukázce kódu.

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
}

Referenční barvy jsou přiřazeny 3bitové indexy (000–111, protože existují 8 hodnot), které budou uloženy v blocích červené a až červené p během komprese.

BC4_SNORM

DXGI_FORMAT_BC4_SNORM je úplně stejná, s výjimkou toho, že data jsou kódována v oblasti SNORM a při interpolaci 4 barevných hodnot. Interpolace dat s jednou komponentou se provádí stejně jako v následující ukázce kódu.

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
}

Referenční barvy jsou přiřazeny 3bitové indexy (000–111, protože existují 8 hodnot), které budou uloženy v blocích červené a až červené p během komprese.

BC5

Formát BC5 slouží k ukládání dvousložek barevných dat pomocí 8 bitů pro každou barvu. V důsledku zvýšené přesnosti (ve srovnání s BC1) je BC5 ideální pro ukládání dat s plovoucí desetinnou čárkou v rozsahu [0 až 1] pomocí formátu DXGI_FORMAT_BC5_UNORM a [-1 až +1] pomocí DXGI_FORMAT_BC5_SNORM formátu. Za předpokladu, že textura 4×4 používá největší možný formát dat, tato technika komprese snižuje paměť požadovanou z 32 bajtů (16 barev × 2 součásti/barva × 1 bajty/komponenta) na 16 bajtů.

Algoritmus funguje na 4×4 blocích texelů. Místo uložení 16 barev pro obě komponenty algoritmus ukládá 2 referenční barvy pro každou komponentu (red_0, red_1, green_0 a green_1) a 16 3bitových barevných indexů pro každou komponentu (červená a až červená p a zelená a až zelená p), jak je znázorněno v následujícím diagramu.

diagram rozložení komprese bc5

Algoritmus používá 3bitové indexy k vyhledání barev z barevné tabulky, která obsahuje 8 barev. První dvě barvy – red_0 a red_1 (nebo green_0 a green_1) – jsou minimální a maximální barvy. Algoritmus vypočítá zbývající barvy pomocí lineární interpolace.

Algoritmus určuje počet interpolovaných barevných hodnot prozkoumáním dvou referenčních hodnot. Pokud je red_0 větší než red_1, pak BC5 interpoluje 6 barevných hodnot; jinak interpoluje 4. Když BC5 interpoluje pouze 4 barevné hodnoty, nastaví zbývající dvě hodnoty barev na 0,0f a 1,0f.

BC5_UNORM

Interpolace dat s jednou komponentou se provádí stejně jako v následující ukázce kódu. Výpočty pro zelené komponenty jsou podobné.

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
}

Referenční barvy jsou přiřazeny 3bitové indexy (000–111, protože existují 8 hodnot), které budou uloženy v blocích červené a až červené p během komprese.

BC5_SNORM

DXGI_FORMAT_BC5_SNORM je úplně stejná, s výjimkou toho, že data jsou kódována v oblasti SNORM a když jsou interpolovány 4 datové hodnoty, jsou dvě další hodnoty -1,0f a 1.0f. Interpolace dat s jednou komponentou se provádí stejně jako v následující ukázce kódu. Výpočty pro zelené komponenty jsou podobné.

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
}

Referenční barvy jsou přiřazeny 3bitové indexy (000–111, protože existují 8 hodnot), které budou uloženy v blocích červené a až červené p během komprese.

Převod formátu pomocí Direct3D 10.1

Direct3D 10.1 umožňuje kopírování mezi předstrukturovanými texturami a blokovými komprimovanými texturami se stejnými bitovými šířkami. Funkce, které toho lze dosáhnout, jsou CopyResource a CopySubresourceRegion.

Od Direct3D 10.1 můžete použít CopyResource a CopySubresourceRegion kopírovat mezi několika typy formátů. Tento typ operace kopírování provádí typ převodu formátu, který reinterpretuje data prostředků jako jiný typ formátu. Podívejte se na tento příklad, který ukazuje rozdíl mezi reinterpretací dat způsobem, jakým se obvykle chová typ převodu:

    FLOAT32 f = 1.0f;
    UINT32 u;

K reinterpretaci "f" jako typu "u" použijte memcpy:

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

V předchozí reinterpretaci se podkladová hodnota dat nezmění; memcpy reinterpretuje hodnotu float jako celé číslo bez znaménka.

Pokud chcete provést typický typ převodu, použijte přiřazení:

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

V předchozím převodu se změní podkladová hodnota dat.

Následující tabulka obsahuje seznam povolených zdrojových a cílových formátů, které můžete použít v tomto typu reinterpretace převodu formátu. Aby reinterpretace fungovala podle očekávání, je nutné správně zakódovat hodnoty.

Šířka bitu Nekomprimovaný prostředek prostředek Block-Compressed
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

 

zdroje (Direct3D 10)