點陣圖區塊壓縮
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 位元 |
BC1Unorm
、BC2Unorm
和 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
、BC2Unorm
或 BC3Unorm
影像的 DDS 檔案,並假設其是以預乘 Alpha 製作。
如果您是撰寫 C++ 專案,則可以使用影像內容管線來轉換影像,如 MSDN 中所述。
您也可以使用 https://github.com/Microsoft/DirectXTex 的 texconv.exe
。 texconv.exe
可以使用 DirectXTex_Desktop_2015.sln 解決方案來建立。 下列命令會將 "smoke.png" 轉換成具有預乘 Alpha 的 BC3Unorm
:
texconv -pmalpha -m 1 -f BC3_UNORM smoke.png