Partager via


Compression de blocs bitmap

CanvasBitmap prend en charge les bitmaps compressées par bloc. Ceux-ci peuvent être chargés à partir d’un fichier DDS ou créés avec CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Les bitmaps compressées en bloc sont idéales pour les applications volumineuses bitmap (telles que les jeux), car elles prennent moins de mémoire et peuvent être dessinées plus efficacement. Une bitmap compressée de bloc utilise jusqu’à 1/8e de la mémoire d’une bitmap non compressée. Par conséquent, le GPU doit accéder à beaucoup moins de mémoire lors du dessin de la bitmap, ce qui entraîne un dessin plus rapide.

À propos de la compression de bloc

La compression de bloc est différente de la compression utilisée par les fichiers PNG ou JPG. Les formats de fichier compressés sont compressés, mais lorsqu’ils sont chargés par Win2D, ils sont compressés dans une bitmap avec un format tel que DirectXPixelFormat::B8G8R8A8UIntNormalized, qui utilise 32 bits (4 octets) par pixel. Par conséquent, une bitmap de 256 x 256 prend 256 * 256 * 4 = 262 144 octets.

Une bitmap compressée en bloc utilise 8 ou 16 octets (selon le format - plus loin dans ce cas) pour stocker un bloc de 4 x 4 pixels. Dans ce cas, une bitmap 256x256 prend 256 * 256 * 256 / (4 * 4) * 8 = 32 768 octets, ou 256 * 256 * (4 * 4) * 16 = 65 536 octets. C’est jusqu’à 8 fois plus petit ! Étant donné que la compression de bloc est prise en charge directement par le matériel GPU, la bitmap peut être conservée compressée en mémoire et dessinée directement à partir du format compressé sans jamais avoir à le décompresser complètement.

Win2D prend en charge trois formats compressés de bloc. Le tableau ci-dessous décrit ces formats, ainsi qu’un format non compressé pour la comparaison.

DirectXPixelFormat Taille de la bitmap 4x4 Taille de 256 x 256 bitmap Alpha
BC1Unorm 8 octets 32 768 octets 1 bit
BC2Unorm 16 octets 65 536 octets 4 bits
BC3Unorm 16 octets 65 536 octets ~8 bits (compressé)
B8G8R8A8UintNormalized 64 octets 262 144 octets 8 bits

BC1Unorm, BC2Unorm et BC3Unorm diffèrent principalement dans la façon dont ils prennent en charge alpha. BC1 prend uniquement en charge l’alpha 1 bits. BC2 prend en charge chaque pixel dans le bloc ayant une valeur alpha unique 4 bits. BC3 compresse les valeurs alpha.

Pour plus d’informations sur le fonctionnement de la compression de bloc, consultez la documentation sur la compression de bloc Direct2D et la documentation sur la compression de bloc Direct3D.

Restrictions

  • Toutes les textures compressées de bloc doivent avoir une largeur et une hauteur qui est un multiple de 4. Cela est dû au fait que la compression de bloc fonctionne sur des blocs de 4 x 4 pixels.
  • Toute opération sur un sous-rectangle d’une texture compressée de bloc (à l’aide GetPixelBytes()de , SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) nécessite que le sous-rectangle soit aligné sur 4 pixels.
  • Win2D nécessite une alpha prémultipliée lors de l’utilisation de formats compressés par bloc.

Création de fichiers DDS

Les images compressées de bloc peuvent être enregistrées dans des fichiers DDS. Bien qu’elles puissent être générées par des plug-ins à des applications telles que Photoshop ou Paint.NET, vous devez veiller à ce que le fichier résultant soit enregistré avec une alpha prémultipliée. Win2D charge tout fichier DDS contenant une image ou BC3Unorm une BC2Unorm BC1Unormimage et suppose qu’il est créé avec alpha prémultiplié.

Si vous créez un projet C++, vous pouvez utiliser le pipeline de contenu d’image pour convertir l’image, comme décrit sur MSDN.

Vous pouvez également utiliser texconv.exe à partir de https://github.com/Microsoft/DirectXTex. texconv.exe peut être généré à l’aide de la solution DirectXTex_Desktop_2015.sln. La commande suivante convertit « smoke.png » en alpha BC3Unorm prémultiplié :

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