Sdílet prostřednictvím


Komprese bloků

Od Windows 8.1 podporuje Direct2D několik blokových komprimovaných pixelů formátů. Kromě toho systém Windows 8.1 obsahuje nový kodek DDS (Windows Imaging Component), který umožňuje načítání a ukládání komprimovaných obrázků ve formátu DDS. Komprese bloků je technika pro snížení množství grafické paměti, která je spotřebována rastrovým obsahem. Pomocí komprese bloků může vaše aplikace snížit spotřebu paměti a časy načítání pro stejné obrázky rozlišení. Nebo může vaše aplikace používat více obrázků s vyšším rozlišením a přitom stále využívat stejné nároky na paměť GPU.

Komprese bloků je používána aplikacemi Direct3D po dlouhou dobu a s Windows 8.1 je k dispozici také pro hlavní a direct2D vývojáře aplikací.

Toto téma popisuje, jak funguje komprese bloků a jak ji používat ve WIC a Direct2D.

O kompresi bloků

Block Compression (BC) odkazuje na třídu technik komprese pro snížení velikosti textury. Direct3D 11 podporuje až 7 různých formátů BC v závislosti na úrovni funkcí. Ve Windows 8.1 Direct2D zavádí podporu pro formáty BC1, BC2 a BC3, které jsou dostupné na všech úrovních funkcí.

Jak funguje komprese bloků

Komprimované formáty bloku používají stejnou základní techniku, aby se snížil prostor spotřebovaný barevnými daty. Tato část shrnuje nejjednodušší algoritmus BC1. Podrobnější vysvětlení najdete v tématu Block Compression.

Nejprve je obrázek rozdělený na bloky 4 až 4 pixely. Každý blok je komprimován samostatně.

Poznámka

To znamená, že šířka a výška obrázku musí mít násobek 4 pixelů, aby byl blokovaný komprimovaný.

 

Tento příklad znázorňuje blok o rozměrech 4 ×4 pixelů v rámci obrázku.

příkladu obrázku je 4x4 pixelový blok v obrázku.

Dále jsou ve 4 až 4 bloku vybrány dvě barvy odkazu a jsou kódovány jako dvě 16bitové hodnoty (5 bitů červená, 6 bitů zelená, 5 bitů modrá). Volba těchto barev výrazně ovlivňuje kvalitu obrázku a je netriviální. Dvě přechodné barvy se počítají lineární interpolací mezi dvěma referenčními barvami v barevném prostoru RGB. To vytváří celkem 4 různé možné barvy; každé barvě je přiřazena dvě bitová hodnota indexu. Všimněte si však, že při opravení interpolace je potřeba uložit pouze dvě barvy koncového bodu.

Na tomto obrázku jsou barvy 0 a 3 vybrány jako "referenční" barvy bloku, zatímco barvy 1 a 2 se počítají pomocí lineární interpolace.

Diagram znázorňující výpočet 4 barevných hodnot představujících blok

Nakonec se každý pixel v bloku mapuje na jednu ze čtyř dříve počítaných barev a každý pixel je kódován pomocí dvoubitové hodnoty indexu.

Celkové množství dat použitých k reprezentaci těchto 16 pixelů:

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

Výsledkem je průměrná hustota 4 bitů na pixel. Pro porovnání používá běžný formát DXGI_FORMAT_B8G8R8A8_UNORM pixelů 32 bitů na pixel.

Tento diagram ukazuje, že každý pixel je kódovaný jako 2bitový index. Celý blok se zakóduje do 64 bitů.

výpočtu 4 barevných hodnot představujících blok.

Existují varianty, které podporují alfa data a různá čísla barevných kanálů. BC6H a BC7 používají výrazně různé algoritmy, aby podporovaly obsah s vysokým dynamickým rozsahem (HDR) a zvýšily kvalitu obrázků.

Formát souboru DDS (DirectDraw Surface)

Komprimovaná data bloku se obvykle ukládají do souborů DDS (DirectDraw Surface). Soubory DDS možná znáte, pokud jste vývojář Direct3D. Mějte na paměti, že Direct2D podporuje pouze určité funkce DDS; Další informace naleznete v tématu požadavky DDS.

Výhody komprese bloků

Blokované komprimované formáty se liší od běžných formátů komprese obrázků v odvětví, jako je JPEG v těchto formátech BC, jsou nativně podporovány moderními grafickými procesory. To znamená, že do GPU můžete přímo načíst komprimovaný obrázek bloku bez dekódování nebo dekomprese. Formáty BC spotřebovávají v průměru od 4 do 8 bitů na pixel; při porovnání s typickým nekomprimovaným 32bitovým rastrovým obrázkem BGRA na pixel, výsledkem je úspora paměti 75% až 87,5%. Vzhledem k tomu, že neexistuje žádný krok dekódování, je doba načtení obrázku BC výrazně snížena ve srovnání s formáty, jako je JPEG.

Kdy použít blokovou kompresi

Pokud chcete snížit spotřebu paměti rastrových obrázků nebo chcete snížit dobu dekódování a načítání, měli byste ve své aplikaci zvážit použití blokovaných komprimovaných obrázků místo jiných formátů, jako je JPEG.

Komprese bloků však není vhodná pro všechny případy a vyžaduje určité kompromisy. Za prvé, algoritmy komprese bloků jsou ztrátové. Komprese bloků funguje dobře s přirozeným fotografickým obsahem, ale může do obrázků s ostrými, vysoce kontrastními hranicemi, jako jsou snímky obrazovky generované počítačem, zavést nežádoucí vizuální artefakty. Před použitím byste měli zajistit, aby blokované komprimované prostředky obrázků měly přijatelnou kvalitu obrázku.

Za druhé, blok komprimované soubory DDS obecně spotřebovávají více místa na disku než srovnatelné obrázky JPEG. To zase zvýší velikost balíčku vaší aplikace a požadavky na šířku pásma sítě.

Použití komprese bloků

Tato část vysvětluje, jak generovat a používat blokované komprimované prostředky v aplikaci Direct2D.

Přehled

Blokované komprimované soubory DDS jsou formát optimalizovaný pro modul runtime, což znamená, že jsou speciálně optimalizované pro dobrý výkon za běhu aplikace. Doporučujeme pokračovat v používání existujícího kanálu pro vytváření a úpravy prostředků a převádět je pouze do komprimovaného formátu bloku při importu do projektu aplikace nebo v době sestavení.

Požadavky DDS

Formát souboru DDS byl navržen tak, aby podporoval širokou škálu funkcí používaných v Direct3D. Direct2D používá pouze podmnožinu těchto funkcí. Proto při vytváření imagí DDS pro použití s Direct2D musíte mít na paměti následující omezení:

  • Jsou povoleny pouze následující DXGI_FORMAT hodnoty:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Musí se použít předem nastavená alfa data. To zahrnuje starší soubory DDS pomocí formátů, které explicitně definují předem definované alfa (DXT1, DXT2, DXT4) a soubory DDS, které používají strukturu DDS_HEADER_DX10 s hodnotami DDS_ALPHA_MODE_OPAQUE a DDS_ALPHA_MODE_PREMULTIPLIED.
  • Rozměry X a Y musí být násobky 4 pixelů.
  • Objemové textury, mapy krychlí, mipmapy nebo pole textur nejsou povoleny. Měli byste použít pouze zdrojové obrázky s jedním rámcem.

Generování komprimovaných prostředků bloku

K dispozici jsou různé nástroje pro vytváření DDS pro vytváření nebo převod blokových komprimovaných souborů DDS. Všimněte si, že všechny nástroje nepodporují požadavky na používání souborů DDS s Direct2D, jak je popsáno v předchozí části.

Počínaje sadou Visual Studio 2013 můžete v sadě Visual Studio převést existující vizuální prostředky, jako je JPEG a PNG, na správný komprimovaný formát DDS jako automatickou součást procesu sestavení. Toho se dosahuje pomocí vlastního kroku sestavení úlohy obsahu obrázku.

Informace o tom, jak nastavit tento projekt, najdete v tématu: Postupy: Export textury pro použití s Direct2D nebo Javascipt Apps.

Rozhraní API Direct2D

Direct2D se aktualizuje ve Windows 8.1, aby podporoval následující formáty pixelů:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

U předchozích formátů je nutné použít premultiplied alfa. Kromě toho jsou tyto formáty platné pouze pro použití jako zdroj, nikoli cíl. To například znamená, že můžete vytvořit rastrový obrázek Direct2D pomocí BC1, ale ne kontextu zařízení.

Ve Windows 8.1 jsou aktualizovány následující metody, aby podporovaly formáty BC:

Všimněte si, že CreateBitmapFromWicBitmap přebírá IWICBitmapSource jako rozhraní; ale v systému Windows 8.1 WIC nepodporuje získání blokovaných komprimovaných dat z IWICBitmapSource, a neexistuje žádný formát WIC pixel odpovídající DXGI_FORMAT_BC1_UNORM atd. Místo toho CreateBitmapFromWicBitmap určí, jestli IWICBitmapSource je platný DDS IWICBitmapFrameDecode a přímo načte blok komprimovaná data. Buď můžete explicitně zadat formát pixelů ve struktuře D2D1_BITMAP_PROPERTIES1, nebo povolit Direct2D automatické určení správného formátu.

Rozhraní API komponent windows imaging

Windows Imaging Component (WIC) přidává nový kodek DDS ve Windows 8.1. Kromě toho přidává nová rozhraní, která podporují přístup k datům specifickým pro DDS, včetně blokových komprimovaných pixelových dat:

  • IWICDdsDecoder
  • IWICDdsEncoder
  • IWICDdsFrameDecode

Block Compressed WIC pixel formats

Ve Windows 8.1 nejsou žádné nové komprimované formáty pixelů WIC. Místo toho, pokud získáte IWICBitmapFrameDecode z dekodéru DDS a volání CopyPixels, obdržíte standardní nekomprimované pixely, jako je WICPixelFormat32bppPBGRA. Pomocí IWICDdsFrameDecode::CopyBlocks získat nezpracovaná komprimovaná data ve formě vyrovnávací paměti ze souboru DDS.

Přístup DDS s více snímky

Formát souboru DDS umožňuje uložení více souvisejících obrázků do jednoho souboru. Například soubor DDS může obsahovat mapu datové krychle, texturu svazku nebo pole textury, z nichž všechny můžou být mipmapped. V Direct3D jsou tyto více obrázků zpřístupněny jako podsourcy. Ve WIC jsou více obrázků vystaveny jako rámce (IWICBitmapFrameDecode a IWICBitmapFrameEncode).

TECHNOLOGIE WIC podporuje pouze pojem jednorozměrného pole snímků, zatímco DDS podporuje tři nezávislé dimenze (i když v jednom souboru mohou být použity pouze dva). WIC poskytuje pomocné metody, které vám pomůžou s mapováním mezi dílčím zdrojem DDS a rámcem WIC. Pro dekódování IWICDdsDecoder::GetFrame umožňuje zadat index pole, úroveň mip a index řezu podsourcu a vrátit správný rámec WIC.

Pro kódování IWICDdsEncoder::CreateNewFrame vypočítá výsledný index pole, úroveň mip a index řezu při vytváření nového rámce. Abyste mohli definovat parametry souboru specifické pro DDS, musíte nejprve volat IWICDdsEncoder::SetParameters.

Postupy: Export textury pro použití s aplikacemi Direct2D nebo Javascipt

Referenční informace k DDS

block compression