位图块压缩

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 位

BC1UnormBC2UnormBC3Unorm 的主要区别在于它们支持 alpha 的方式。 BC1 仅支持 1 位 alpha。 BC2 支持块中的每个像素具有唯一的 4 位 alpha 值。 BC3 对 Alpha 值进行压缩。

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

Restrictions

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

创建 DDS 文件

块压缩图像可以保存在 DDS 文件中。 虽然这些可以由 Photoshop 或 Paint.NET 等应用程序的插件生成,但必须注意确保生成的文件以预乘 Alpha 保存。 Win2D 将加载包含 BC1UnormBC2UnormBC3Unorm 图像的任何 DDS 文件,并假定其是以预乘 Alpha 创作的。

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

或者,您可以使用来自 https://github.com/Microsoft/DirectXTextexconv.exetexconv.exe 可以使用DirectXTex_Desktop_2015.sln解决方案生成。 以下命令将“smoke.png”转换为具有预乘 Alpha 的 BC3Unorm

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