位图块压缩

CanvasBitmap 支持块压缩位图。 可以从 DDS 文件加载这些内容,也可以使用 CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

块压缩位图非常适合位图繁重的应用程序(如游戏),因为它们占用的内存较少,可以更高效地绘制。 块压缩位图最多使用未压缩位图的内存的 1/8。 因此,GPU 在绘制位图时需要访问更少的内存,从而加快绘制速度。

关于块压缩

块压缩不同于 PNG 或 JPG 文件使用的压缩。 压缩文件格式是压缩的,但是当 Win2D 加载它们时,它们将被解压缩到具有格式的位图中,例如 DirectXPixelFormat::B8G8R8A8UIntNormalized,每个像素使用 32 位(4 字节)。 因此,256x256 位图将占用 256 * 256 * 4 = 262,144 字节。

块压缩位图使用 8 或 16 个字节(具体取决于格式 -- 稍后更多)来存储 4x4 像素块。 因此,在这种情况下,256x256 位图将占用 256 * 256 / (4 * 4) * 8 = 32,768 字节,或 256 * 256 / (4 * 4) * 16 = 65,536 字节。 这要小 8 倍! 由于 GPU 硬件直接支持块压缩,因此位图可以在内存中保持压缩,直接从压缩格式绘制,而无需完全解压缩它。

Win2D 支持三种块压缩格式。 下表描述了这些格式,以及用于比较的未压缩格式。

DirectXPixelFormat 大小为 4x4 位图 大小为 256x256 位图 Alpha
BC1Unorm 8 字节 32,768 字节 1 位
BC2Unorm 16 个字节 65,536 字节 4 位
BC3Unorm 16 个字节 65,536 字节 约 8 位(压缩)
B8G8R8A8UintNormalized 64 字节 262,144 字节 8 位

BC1UnormBC2Unorm 而且 BC3Unorm 在它们支持 alpha 的方式上大相径庭。 BC1 仅支持 1 位 alpha。 BC2 支持块中的每个像素具有唯一的 4 位 alpha 值。 BC3 压缩 alpha 值。

有关块压缩工作原理的详细信息,请参阅 Direct2D 块压缩文档Direct3D 块压缩文档

限制

  • 所有块压缩纹理的宽度和高度都必须是 4 的倍数。 这是因为块压缩适用于 4x4 像素块。
  • 块压缩纹理(使用 GetPixelBytes()SetPixelBytes(Byte[])CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)子矩形上的任何操作都要求子矩形对齐 4 像素。
  • 使用块压缩格式时,Win2D 需要预乘 alpha。

创作 DDS 文件

块压缩图像可以保存在 DDS 文件中。 尽管这些插件可由 Photoshop 或 Paint.NET 等应用程序生成,但必须确保生成的文件是使用预乘 alpha 保存的。 Win2D 将加载包含或 BC1Unorm图像的任何 DDS 文件, BC2Unorm BC3Unorm 并假定它是使用预乘 alpha 创作的。

如果要创作C++项目,则可以使用图像内容管道转换图像,如 MSDN 中所述

或者,可以使用 texconv.exe . https://github.com/Microsoft/DirectXTex. texconv.exe 可以使用DirectXTex_Desktop_2015.sln解决方案生成。 以下命令将“smoke.png”转换为 BC3Unorm 预乘 alpha:

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