Bitmap-blokcompressie

CanvasBitmap ondersteunt gecomprimeerde blok bitmaps. Deze kunnen worden geladen vanuit een DDS-bestand of worden gemaakt met CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Gecomprimeerde blok bitmaps zijn ideaal voor bitmap zware toepassingen (zoals games) omdat ze minder geheugen in beslag nemen en efficiƫnter kunnen worden getekend. Een gecomprimeerde blok bitmap gebruikt maximaal 1/8e van het geheugen van een niet-gecomprimeerde bitmap. Als gevolg hiervan heeft de GPU veel minder geheugen nodig bij het tekenen van de bitmap, wat resulteert in een snellere tekening.

Over blokcompressie

Blokcompressie verschilt van de compressie die wordt gebruikt door PNG- of JPG-bestanden. Gecomprimeerde bestandsindelingen worden gecomprimeerd opgeslagen, maar wanneer ze worden geladen door Win2D, worden ze gedecomprimeerd in een bitmap met een indeling zoals DirectXPixelFormat::B8G8R8A8UIntNormalized, die 32 bits (4 bytes) per pixel gebruikt. Een bitmap van 256x256 neemt dus 256 * 256 * 4 = 262.144 bytes in beslag.

Een gecomprimeerde blok bitmap gebruikt 8 of 16 bytes (afhankelijk van de indeling , meer hierover later) om een blok van 4x4 pixels op te slaan. In dit geval neemt een bitmap van 256x256 256 * 256 / (4 * 4) * 8 = 32.768 bytes of 256 * 256 / (4 * 4) * 16 = 65.536 bytes in beslag. Dat is maximaal 8 keer kleiner! Omdat blokcompressie rechtstreeks wordt ondersteund door de GPU-hardware, kan de bitmap worden gecomprimeerd in het geheugen en rechtstreeks uit de gecomprimeerde indeling worden getrokken zonder dat u deze ooit volledig hoeft op te heffen.

Win2D ondersteunt drie blok gecomprimeerde indelingen. In de onderstaande tabel worden deze indelingen beschreven, samen met een niet-gecomprimeerde indeling voor vergelijking.

DirectXPixelFormat Grootte van de 4x4-bitmapafbeelding Grootte van de bitmap van 256 x 256 Alpha
BC1Unorm 8 bytes 32.768 bytes 1 bit
BC2Unorm 16 bytes 65.536 bytes 4 bit
BC3Unorm 16 bytes 65.536 bytes ~8-bits (gecomprimeerd)
B8G8R8A8UintNormalized 64 bytes 262.144 bytes 8 bit

BC1Unormen BC2UnormBC3Unorm verschillen meestal in de wijze waarop ze alfa ondersteunen. BC1 ondersteunt slechts 1-bits alfa. BC2 ondersteunt elke pixel in het blok met een unieke 4-bits alfawaarde. BC3 comprimeert de alfawaarden.

Zie de documentatie voor Direct2D-blokcompressie en direct3D-blokcompressie voor meer informatie over hoe blokcompressie werkt.

Restrictions

  • Alle blok gecomprimeerde patronen moeten een breedte en hoogte hebben die een veelvoud van 4 is. Dit komt doordat blokcompressie werkt op blokken van 4x4 pixels.
  • Elke bewerking op een subrechthoek van een blokgecomprimeerde textuur (met GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) vereist dat de subrechthoek op 4 pixels is uitgelijnd.
  • Win2D vereist voorgemultipliceerde alfa bij gebruik van blokgecomprimeerde indelingen.

DDS-bestanden maken

Blokgecomprimeerde afbeeldingen kunnen worden opgeslagen in DDS-bestanden. Hoewel deze kunnen worden gegenereerd door invoegtoepassingen voor toepassingen zoals Photoshop of Paint.NET, moet u ervoor zorgen dat het resulterende bestand wordt opgeslagen met vooraf gedefinieerde alfa. Win2D laadt elk DDS-bestand dat een BC1Unorm-, BC2Unorm- of BC3Unormafbeelding bevat en gaat ervan uit dat het is gemaakt met voorgemultipliceerde alfa.

Als u een C++-project maakt, kunt u de Image Content Pipeline gebruiken om de afbeelding te converteren, zoals beschreven in de Visual Studio-documentatie.

U kunt ook gebruikmaken van texconv.exe van https://github.com/Microsoft/DirectXTex. texconv.exe kan worden gebouwd met behulp van de DirectXTex_Desktop_2015.sln-oplossing. Met de volgende opdracht wordt 'smoke.png' omgezet in een BC3Unorm met voorgemultipliceerde alfa:

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