Megosztás a következőn keresztül:


Blokktömörítés

A Windows 8.1-től kezdve a Direct2D számos blokktömörített képpontformátumot támogat. Emellett a Windows 8.1 tartalmaz egy új Windows Képalkotó összetevőt (WIC) tartalmazó DDS-kodeket, amely lehetővé teszi a blokkok tömörített lemezképeinek DDS-fájlformátumban való betöltését és tárolását. A blokktömörítés a bitképtartalmak által felhasznált grafikus memória mennyiségének csökkentésére szolgáló technika. A blokktömörítés használatával az alkalmazás csökkentheti az azonos felbontású képek memóriahasználatát és betöltési idejét. Vagy az alkalmazás több vagy nagyobb felbontású képeket is használhat, miközben továbbra is ugyanazt a GPU-memóriaigényt használja.

A Direct3D-alkalmazások már régóta használják a blokktömörítést, és a Windows 8.1-ben a mainstream és a Direct2D alkalmazásfejlesztők is használhatják.

Ez a témakör a blokktömörítés működését és használatát ismerteti a WIC-ben és a Direct2D-ben.

Tudnivalók a blokktömörítésről

Blokktömörítési (BC) a textúrák méretének csökkentésére szolgáló tömörítési technikák osztályára utal. A Direct3D 11 funkciószinttől függően legfeljebb 7 különböző BC-formátumot támogat. A Windows 8.1 Direct2D támogatja a BC1, BC2 és BC3 formátumokat, amelyek minden funkciószinten elérhetők.

A blokktömörítés működése

A blokktömörített formátumok mind ugyanazt az alapszintű technikát használják a színadatok által felhasznált terület csökkentésére. Ez a szakasz a legegyszerűbb algoritmust, a BC1-et foglalja össze. Részletesebb magyarázatért lásd blokktömörítési.

Először is a kép 4 és 4 képpontos blokkokra van osztva. Minden blokk külön van tömörítve.

Jegyzet

Ez azt jelenti, hogy a kép szélességének és magasságának 4 képpont többszörösének kell lennie ahhoz, hogy a kép blokktömörítve legyen.

 

Ez a példakép egy 4x4 képpontos blokkot jelenít meg egy képen belül.

egy példakép egy 4x4 képpontos blokkot jelenít meg egy képen belül.

Ezután egy 4-4 blokkon belül két "referencia" szín van kiválasztva, és két 16 bites értékként van kódolva (5 bit piros, 6 bit zöld, 5 bit kék). Ezeknek a színeknek a kiválasztása jelentősen befolyásolja a kép minőségét, és nemtriviális. Két köztes szín kiszámítása lineáris interpolációval történik az RGB színtér két referenciaszíne között. Ez összesen 4 különböző színt eredményez; minden színhez kétbites indexérték van rendelve. Vegye figyelembe azonban, hogy csak a két végpontszínt kell tárolni az interpoláció kijavítása során.

Ebben az ábrában a 0 és a 3 szín lesz kiválasztva a blokk "referencia" színeként, míg az 1. és a 2. szín lineáris interpolációval van kiszámítva.

diagram, amely a blokkot ábrázoló 4 színérték számítását mutatja.

Végül a blokk minden képpontja a korábban számított négy szín egyikére van leképezve, és minden képpont a kétbites indexértékkel van kódolva.

A 16 képpontot ábrázoló adatok teljes mennyisége a következő:

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

Ez 4 bit/képpont átlagos sűrűséget eredményez. Összehasonlításképpen a gyakori DXGI_FORMAT_B8G8R8A8_UNORM képpontformátum képpontonként 32 bitet használ fel.

Ez az ábra azt mutatja, hogy minden képpont 2 bites indexként van kódolva. A teljes blokk 64 bitben van kódolva.

4 színérték kiszámítása a blokk megjelenítéséhez.

Vannak variációk az alfaadatok és a különböző számú színcsatornák támogatásához. A BC6H és a BC7 jelentősen eltérő algoritmusokat használ a nagy dinamikatartományú (HDR) tartalmak támogatásához és a képminőség növeléséhez.

DirectDraw Surface (DDS) fájlformátum

A blokktömörített adatokat általában DirectDraw Surface- fájlokban tárolják. Ha Ön Direct3D-fejlesztő, akkor a DDS-fájlokat ismerheti. Vegye figyelembe, hogy a Direct2D csak bizonyos DDS-funkciókat támogat; további információ: DDS-követelmények.

A blokktömörítés előnyei

A blokktömörített formátumok eltérnek az általános iparági képtömörítési formátumoktól, például a JPEG formátumoktól, mivel a BC formátumokat a modern GPU-k natív módon támogatják. Ez azt jelenti, hogy közvetlenül betölthet egy blokk tömörített képet a GPU-ra dekódolás vagy dekompresszió nélkül. A BC formátumok átlagosan 4–8 bit/képpontot fogyasztanak; egy átlagos tömörítetlen 32 bites képpontonkénti BGRA-bitképhez képest ez 75% és 87,5%memóriamegtakarítást eredményez. Mivel nincs dekódoló lépés, a BC-képek betöltésének ideje jelentősen csökken a JPEG formátumokhoz képest.

Mikor érdemes blokktömörítést használni?

Ha csökkenteni szeretné a bitképek memóriahasználatát, vagy csökkenteni szeretné a dekódolás és a betöltési időt, érdemes megfontolnia a blokkos tömörített képek használatát az alkalmazásban más formátumok, például a JPEG helyett.

A blokktömörítés azonban nem minden esetben megfelelő, és bizonyos kompromisszumokat igényel. Először is a blokktömörítési algoritmusok veszteségesek. A blokktömörítés jól működik a természetes fényképészeti tartalommal, de a nem kívánt vizuális összetevőket éles, kontrasztos határokkal rendelkező képekbe, például a számítógép által létrehozott képernyőképekbe is bevezetheti. Használat előtt győződjön meg arról, hogy a blokk tömörített lemezkép-objektumai elfogadható képminőséggel rendelkeznek.

Másodszor, a blokktömörített DDS-fájlok általában több helyet foglalnak el a lemezen, mint a hasonló JPEG-képek. Ez pedig növeli az alkalmazás csomagméretére és hálózati sávszélességére vonatkozó követelményeket.

Blokktömörítés használata

Ez a szakasz bemutatja, hogyan hozhat létre és használhat blokkalapú tömörített objektumokat Egy Direct2D-alkalmazásban.

Áttekintés

A tömörített DDS-fájlok blokkolása futtatókörnyezetre optimalizált formátum, ami azt jelenti, hogy kifejezetten a megfelelő teljesítményre vannak optimalizálva az alkalmazás futtatókörnyezetében. Azt javasoljuk, hogy továbbra is használja a meglévő eszközlétrehozési és -szerkesztési folyamatot, és csak akkor alakítsa át blokkok tömörített formátumára, amikor importálja őket az alkalmazásprojektbe, vagy a létrehozáskor.

DDS-követelmények

A DDS-fájlformátum a Direct3D-ben használt funkciók széles skáláját támogatja. A Direct2D csak ezeknek a funkcióknak egy részét használja. Ezért amikor DDS-lemezképeket hoz létre a Direct2D-vel való használatra, tartsa szem előtt a következő korlátozásokat:

  • Csak a következő DXGI_FORMAT értékek engedélyezettek:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Előre meghatározott alfaadatokat kell használni. Ide tartoznak az előre meghatározott alfa (DXT1, DXT2, DXT4) explicit módon definiált formátumokat használó örökölt DDS-fájlok, valamint a DDS_ALPHA_MODE_OPAQUE és DDS_ALPHA_MODE_PREMULTIPLIED értékekkel rendelkező DDS_HEADER_DX10 struktúrát használó DDS-fájlok.
  • Az X és az Y dimenziónak 4 képpont többszörösének kell lennie.
  • A kötetmintázatok, kockaképek, mipmapek vagy textúratömbök nem engedélyezettek. Csak egy képkockás forrásképeket használjon.

Blokktömörített objektumok létrehozása

A blokktömörített DDS-fájlok létrehozásához vagy konvertálásához számos DDS-szerkesztőeszköz érhető el. Ne feledje, hogy nem minden eszköz támogatja a DDS-fájlok Direct2D-vel való használatára vonatkozó követelményeket az előző szakaszban leírtak szerint.

A Visual Studio 2013-tól kezdve a Visual Studio a buildelési folyamat automatikus részeként a megfelelő DDS-blokkok tömörített formátumára konvertálhatja a meglévő vizuális eszközöket, például a JPEG-t és a PNG-t. Ez az Image Content Task egyéni buildelési lépésével történik.

További információ a projekt beállításáról: Textúra exportálása Direct2D- vagy Javascipt-alkalmazásokkal.

Direct2D API-k

A Direct2D a Windows 8.1-ben frissül a következő képpontformátumok támogatásához:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Az előző formátumokhoz előre meghatározott alfa betűt kell használnia. Emellett ezek a formátumok csak forrásként, nem célként használhatók. Ez például azt jelenti, hogy a Direct2D-bitképeket a BC1 használatával hozhatja létre, eszközkörnyezetet azonban nem.

A Windows 8.1-ben a következő módszerek frissülnek a BC-formátumok támogatásához:

Vegye figyelembe, hogy CreateBitmapFromWicBitmapIWICBitmapSource felületet vesz igénybe; a Windows 8.1-ben azonban a WIC nem támogatja a blokktömörített adatok beszerzését IWICBitmapSource, és nincs DXGI_FORMAT_BC1_UNORM megfelelő WIC-képpontformátum stb. Ehelyett CreateBitmapFromWicBitmap megállapítja, hogy az IWICBitmapSource érvényes DDS IWICBitmapFrameDecode, és közvetlenül betölti a blokkok tömörített adatait. Explicit módon megadhatja a képpontformátumot a D2D1_BITMAP_PROPERTIES1 szerkezetben, vagy engedélyezheti, hogy a Direct2D automatikusan meghatározza a megfelelő formátumot.

Windows képalkotó összetevő API-k

A Windows Képalkotó összetevő (WIC) új DDS-kodeket ad hozzá a Windows 8.1-ben. Emellett olyan új interfészeket is hozzáad, amelyek támogatják a DDS-specifikus adatok elérését, beleértve a blokkok tömörített képpontadatait is:

Tömörített WIC-képpontformátumok letiltása

A Windows 8.1-ben nincsenek új WIC-blokkok által tömörített képpontformátumok. Ehelyett, ha IWICBitmapFrameDecode kap a DDS dekóderből, és meghívja CopyPixels, normál tömörítetlen képpontokat fog kapni, például WICPixelFormat32bppPBGRA. A IWICDdsFrameDecode::CopyBlocks használatával dDS-fájlból memóriapuffer formájában szerezheti be a nyers blokkok tömörített adatait.

Többkeretes DDS-hozzáférés

A DDS fájlformátum lehetővé teszi több kapcsolódó rendszerkép egyetlen fájlban való tárolását. A DDS-fájlok például tartalmazhatnak kockaképet, kötetmintát vagy textúratömböt, amelyek mindegyike leképezhető. A Direct3D-ben ezek a képek alforrásként jelennek meg. A WIC-ben több kép is képkockákként jelenik meg (IWICBitmapFrameDecode és IWICBitmapFrameEncode).

A WIC csak egydimenziós kerettömb fogalmát támogatja, míg a DDS három független dimenziót támogat (bár egyetlen fájlban csak kettő használható). A WIC kényelmes módszereket biztosít a DDS-alforrás és a WIC-keret közötti leképezéshez. Dekódoláshoz IWICDdsDecoder::GetFrame lehetővé teszi az alforrás tömbindexének, mip-szintjének és szeletindexének megadását, és a megfelelő WIC-keretet adja vissza.

Kódoláshoz IWICDdsEncoder::CreateNewFrame kiszámítja az eredményül kapott tömbindexet, a mip szintet és a szeletindexet egy új keret létrehozásakor. Először IWICDdsEncoder::SetParameters kell meghívnia a DDS-specifikus fájlparaméterek meghatározásához.

Útmutató: Textúra exportálása Direct2D- vagy Javascipt-alkalmazásokkal

DDS-

Blokktömörítési