次の方法で共有


ビットマップのブロック圧縮

CanvasBitmap では、ブロック圧縮ビットマップがサポートされます。 これらは DDS ファイルから読み込むか、 CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat)を使用して作成できます。

ブロック圧縮ビットマップは、メモリを占有する量が少なく、より効率的に描画できるため、ビットマップの負荷の高いアプリケーション (ゲームなど) に適しています。 ブロック圧縮ビットマップは、圧縮されていないビットマップのメモリの最大 1/8 分の 1 を使用します。 その結果、GPU はビットマップを描画するときにはるかに少ないメモリにアクセスする必要があります。その結果、描画が高速化されます。

ブロック圧縮について

ブロック圧縮は、PNG または JPG ファイルで使用される圧縮とは異なります。 圧縮されたファイル形式は圧縮されて格納されますが、Win2D によって読み込まれると、 DirectXPixelFormat::B8G8R8A8UIntNormalizedなどの形式のビットマップに展開されます。これは、ピクセルあたり 32 ビット (4 バイト) を使用します。 したがって、256 x 256 ビットマップは 256 * 256 * 4 = 262,144 バイトを占有します。

ブロック圧縮ビットマップは、4 x 4 ピクセルのブロックを格納するために 8 バイトまたは 16 バイトを使用します (形式に応じて)。詳細については後で説明します。 したがって、この場合、256 x 256 ビットマップは 256 * 256 / (4 * 4) * 8 = 32,768 バイト、または 256 * 256 / (4 * 4) * 16 = 65,536 バイトを占有します。 これは最大 8 倍小さくなります。 ブロック圧縮は GPU ハードウェアによって直接サポートされるため、ビットマップをメモリに圧縮し、圧縮形式から直接描画できます。完全に圧縮を解除する必要はありません。

Win2D では、3 つのブロック圧縮形式がサポートされています。 次の表では、これらの形式と比較用の非圧縮形式について説明します。

DirectXPixelFormat 4 x 4 ビットマップのサイズ 256 x 256 ビットマップのサイズ Alpha
BC1Unorm 8 バイト 32,768 バイト 1 ビット
BC2Unorm 16 バイト 65,536 バイト 4 ビット
BC3Unorm 16 バイト 65,536 バイト 最大 8 ビット (圧縮)
B8G8R8A8UintNormalized 64 バイト 262,144 バイト 8 ビット

BC1UnormBC2Unorm 、および BC3Unorm は、アルファをサポートする方法でほとんど異なります。 BC1 では、1 ビットアルファのみがサポートされます。 BC2 は、一意の 4 ビットアルファ値を持つブロック内の各ピクセルをサポートします。 BC3 はアルファ値を圧縮します。

ブロック圧縮の動作の詳細については Direct2D ブロック圧縮のドキュメント および Direct3D ブロック圧縮のドキュメント を参照してください。

制限

  • すべてのブロック圧縮テクスチャは、幅と高さが 4 の倍数である必要があります。 これは、ブロック圧縮が 4 x 4 ピクセルのブロックで機能するためです。
  • ブロック圧縮テクスチャのサブ四角形 ( GetPixelBytes()SetPixelBytes(Byte[])CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32) を使用) に対する操作では、サブ四角形が 4 ピクセルで整列されている必要があります。
  • Win2D では、ブロック圧縮形式を使用する場合、事前乗算されたアルファが必要です。

DDS ファイルの作成

ブロック圧縮イメージは、DDS ファイルに保存できます。 これらは、Photoshopや Paint.NET などのアプリケーションにプラグインによって生成できますが、結果のファイルが事前乗算されたアルファで保存されるように注意する必要があります。 Win2D は、 BC1UnormBC2Unorm 、または BC3Unorm イメージを含む DDS ファイルを読み込み、事前乗算されたアルファで作成されていることを前提としています。

C++ プロジェクトを作成する場合は、 MSDN で説明されているように、イメージ コンテンツ パイプラインを使用してイメージを変換

または、https://github.com/Microsoft/DirectXTexからtexconv.exeを使用することもできます。 texconv.exe は、DirectXTex_Desktop_2015.sln ソリューションを使用してビルドできます。 次のコマンドは、"smoke.png" を事前乗算されたアルファを持つ BC3Unorm に変換します。

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