共用方式為


點陣圖區塊壓縮

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 區塊壓縮文件

限制

  • 所有區塊壓縮紋理的寬度和高度都必須是 4 的倍數。 這是因為區塊壓縮是以 4x4 像素的區塊來進行。
  • 對區塊壓縮紋理子矩形的任何操作 (使用 GetPixelBytes()SetPixelBytes(Byte[])CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) 都需要子矩形對齊 4 像素。
  • 使用區塊壓縮格式時,Win2D 需要預乘 Alpha。

製作 DDS 檔案

區塊壓縮的影像可以儲存在 DDS 檔案中。 雖然這些可由 Photoshop 或 Paint.NET 等應用程式的外掛程式產生,但請務必小心,以確保產生的檔案是以預乘 Alpha 儲存。 Win2D 會載入任何包含 BC1UnormBC2UnormBC3Unorm 影像的 DDS 檔案,並假設其是以預乘 Alpha 製作。

如果您是撰寫 C++ 專案,則可以使用影像內容管線來轉換影像,如 MSDN 中所述。

您也可以使用 https://github.com/Microsoft/DirectXTextexconv.exetexconv.exe 可以使用 DirectXTex_Desktop_2015.sln 解決方案來建立。 下列命令會將 "smoke.png" 轉換成具有預乘 Alpha 的 BC3Unorm

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