Komprese rastrového bloku

CanvasBitmap podporuje blokové komprimované rastrové obrázky. Tyto lze načíst ze souboru DDS nebo vytvořit pomocí CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Blokované komprimované rastrové obrázky jsou skvělé pro rastrové náročné aplikace (například hry), protože zabírají méně paměti a dají se kreslit efektivněji. Blokový komprimovaný rastrový obrázek používá až 1/8th paměti nekomprimovaného rastrového obrázku. V důsledku toho musí GPU při kreslení rastrového obrázku přistupovat k mnohem méně paměti, což vede k rychlejšímu kreslení.

Komprese bloků

Bloková komprese se liší od komprese používané v souborech PNG nebo JPG. Soubory v komprimovaných formátech jsou uložené v komprimované podobě, ale když je načte Win2D, dekomprimují se do rastrového obrazu ve formátu, jako je například DirectXPixelFormat::B8G8R8A8UIntNormalized, který používá 32 bitů (4 bajtech) na pixel. Takže bitmapa o rozměrech 256 × 256 by zabrala 256 × 256 × 4 = 262 144 bajtů.

Blokově komprimovaný rastrový obrázek používá 8 nebo 16 bajtů (v závislosti na formátu – více o tom později) k uložení bloku 4x4 pixelů. V tomto případě by tedy rastrový obrázek o rozměrech 256 × 256 zabral 256 * 256 / (4 * 4) * 8 = 32 768 bajtů nebo 256 * 256 / (4 * 4) * 16 = 65 536 bajtů. To je až 8krát menší! Vzhledem k tomu, že komprese bloků je podporována přímo hardwarem GPU, lze rastrový obrázek komprimovat v paměti a kreslit přímo z komprimovaného formátu, aniž by bylo nutné jej úplně odkomprimovat.

Win2D podporuje tři blokové komprimované formáty. Následující tabulka popisuje tyto formáty spolu s nekomprimovaným formátem pro porovnání.

DirectXPixelFormat Velikost rastrového obrázku 4x4 Velikost rastrového obrázku 256 × 256 Alpha
BC1Unorm 8 bajtů 32 768 bajtů 1 bit
BC2Unorm 16 bajtů 65 536 bajtů 4bitový
BC3Unorm 16 bajtů 65 536 bajtů ~8 bitů (komprimováno)
B8G8R8A8UintNormalized 64 bajtů 262 144 bajtů 8 bitů

BC1Unorma BC2UnormBC3Unorm liší se většinou v tom, jak podporují alfa. BC1 podporuje pouze 1bitovou alfa. BC2 podporuje každý pixel bloku, který má jedinečnou 4bitovou alfa hodnotu. BC3 zkomprimuje alfa hodnoty.

Další informace o fungování komprese bloků najdete v dokumentaci ke kompresi bloků Direct2D a dokumentaci k kompresi bloků Direct3D .

Restrictions

  • Všechny komprimované textury bloku musí mít šířku a výšku, která je násobkem 4. Důvodem je to, že komprese bloků funguje na blocích 4x4 pixelů.
  • Jakékoli operace s podobdélníkem blokově komprimované textury (pomocí GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) vyžadují, aby byl podobdélník zarovnaný na 4 pixely.
  • Win2D vyžaduje premultiplikovanou alfu při použití blokově komprimovaných formátů.

Vytváření souborů DDS

Blokově komprimované obrázky lze uložit do souborů DDS. Přestože je lze vytvářet pomocí zásuvných modulů pro aplikace, jako je Photoshop nebo Paint.NET, je třeba dbát na to, aby byl výsledný soubor uložen s přednásobeným alfa kanálem. Win2D načte jakýkoli soubor DDS, který obsahuje obraz BC1Unorm, BC2Unorm nebo BC3Unorm, a předpokládá, že byl vytvořen s premultiplikovaným alfa kanálem.

Pokud vytváříte projekt C++, můžete k převodu obrázku použít kanál obsahu obrázku, jak je popsáno v Visual Studio dokumentaci.

Případně můžete použít texconv.exe z https://github.com/Microsoft/DirectXTex. texconv.exe lze sestavit pomocí řešení DirectXTex_Desktop_2015.sln. Následující příkaz převede „smoke.png“ na BC3Unorm s přednásobeným alfa kanálem:

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png