ブロック圧縮

Direct2D では、Windows 8.1以降、複数のブロック圧縮ピクセル形式がサポートされています。 さらに、Windows 8.1には、DDS ファイル形式でブロック圧縮イメージの読み込みと格納を可能にする新しい Windows イメージング コンポーネント (WIC) DDS コーデックが含まれています。 ブロック圧縮は、ビットマップ コンテンツによって消費されるグラフィックス メモリの量を減らす手法です。 ブロック圧縮を使用すると、アプリで同じ解像度の画像のメモリ消費量と読み込み時間を短縮できます。 または、アプリでは、同じ GPU メモリフットプリントを使用しながら、より解像度の高いイメージを使用できます。

ブロック圧縮は Direct3D アプリケーションで長い間使用されており、Windows 8.1ではメインストリームおよび Direct2D アプリケーション開発者も利用できます。

このトピックでは、ブロック圧縮のしくみと、WIC および Direct2D でブロック圧縮を使用する方法について説明します。

ブロック圧縮について

ブロック圧縮 (BC) は、テクスチャ サイズを小さくするための圧縮手法のクラスを指します。 Direct3D 11 では、機能レベルに応じて最大 7 種類の BC 形式がサポートされます。 Windows 8.1 Direct2D では、すべての機能レベルで使用できる BC1、BC2、BC3 形式のサポートが導入されています。

ブロック圧縮のしくみ

ブロック圧縮形式では、すべて同じ基本的な手法を使用して、カラー データによって消費される領域を減らします。 このセクションでは、最も単純なアルゴリズム BC1 についてまとめます。 詳細については、「 ブロック圧縮」を参照してください。

まず、画像は 4 x 4 ピクセルのブロックに分割されます。 各ブロックは個別に圧縮されます。

Note

つまり、イメージの幅と高さは、圧縮をブロックするには、それぞれ 4 ピクセルの倍数である必要があります。

 

次の画像例は、画像内の 4 x 4 ピクセル のブロックを示しています。

画像の例は、画像内の 4 x 4 ピクセル のブロックを示しています。

次に、4 バイ 4 ブロック内で、2 つの "参照" 色が選択され、2 つの 16 ビット値 (5 ビット赤、6 ビット緑、5 ビット青) としてエンコードされます。 これらの色の選択は、画質に大きく影響し、有害ではない。 2 つの中間色は、RGB 色空間内の 2 つの参照色の間を直線的に補間することによって計算されます。 これにより、合計 4 つの異なる色が生成されます。各色には 2 ビットのインデックス値が割り当てられます。 ただし、補間が固定されているため、2 つのエンドポイント カラーのみを格納する必要があることに注意してください。

この図では、ブロックの "参照" 色として色 0 と 3 が選択され、色 1 と 2 は線形補間を使用して計算されます。

ブロックを表す 4 色の値の計算を示す図。

最後に、ブロック内のすべてのピクセルは、以前に計算された 4 つの色のいずれかにマップされ、各ピクセルは 2 つのビット インデックス値を使用してエンコードされます。

これらの 16 ピクセルを表すために使用されるデータの合計量は次のとおりです。

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

これにより、平均密度は 1 ピクセルあたり 4 ビットになります。 比較のために、一般的なDXGI_FORMAT_B8G8R8A8_UNORMピクセル形式は 1 ピクセルあたり 32 ビットを消費します。

この図は、各ピクセルが 2 ビット インデックスとしてエンコードされていることを示しています。 ブロック全体が 64 ビットでエンコードされます。

4色の値を計算してブロックを表します。

アルファ データとさまざまな数のカラー チャネルをサポートするバリエーションがあります。 BC6H と BC7 は、高ダイナミック レンジ (HDR) コンテンツをサポートし、それぞれ画質を向上させるために、大幅に異なるアルゴリズムを使用します。

DirectDraw Surface (DDS) ファイル形式

ブロック圧縮データは、通常、 DirectDraw Surface (DDS) ファイルに格納されます。 Direct3D 開発者の場合は、DDS ファイルに精通している可能性があります。 Direct2D では特定の DDS 機能のみがサポートされることに注意してください。詳細については、「 DDS の要件」を参照してください。

ブロック圧縮の利点

ブロック圧縮形式は、BC 形式が最新の GPU でネイティブにサポートされているという点で、JPEG などの一般的な業界イメージ圧縮形式とは異なります。 つまり、デコードや圧縮解除を行わずに、ブロック圧縮イメージを GPU に直接読み込むことができます。 BC 形式は、平均してピクセルあたり 4 ~ 8 ビットを消費します。一般的な非圧縮 32 ビット /ピクセル BGRA ビットマップと比較すると、メモリが 75% から 87.5% 節約されます。 また、デコードステップがないため、JPEGのようなフォーマットに比べてBC画像を読み込む時間が大幅に短縮されます。

ブロック圧縮を使用するタイミング

ビットマップのメモリ消費量を減らすか、デコードと読み込み時間を短縮する場合は、JPEG などの他の形式ではなく、アプリでブロック圧縮画像を使用することを検討する必要があります。

ただし、ブロック圧縮はすべてのケースに適しているわけではありません。一部のトレードオフが必要です。 まず、ブロック圧縮アルゴリズムは損失です。 ブロック圧縮は、自然な写真コンテンツに対して適切に機能しますが、コンピューターで生成されたスクリーンショットなど、鮮明でコントラストの高い境界を持つ画像に不要な視覚成果物を導入する可能性があります。 ブロック圧縮イメージアセットを使用する前に、許容される画質を確保する必要があります。

第2に、ブロック圧縮DDSファイルは、通常、同等のJPEG画像よりもディスク上のより多くの領域を消費します。 これにより、アプリのパッケージ サイズとネットワーク帯域幅の要件が増えます。

ブロック圧縮の使用

このセクションでは、Direct2D アプリでブロック圧縮資産を生成して使用する方法について説明します。

概要

圧縮 DDS ファイルのブロックは、実行時に最適化された形式です。つまり、アプリの実行時のパフォーマンスを向上させるために特別に最適化されています。 既存のアセットの作成と編集パイプラインを引き続き使用し、それらをアプリケーション プロジェクトにインポートするとき、またはビルド時にのみブロック圧縮形式に変換することをお勧めします。

DDS の要件

DDS ファイル形式は、Direct3D で使用される幅広い機能をサポートするように設計されています。 Direct2D では、これらの機能のサブセットのみが使用されます。 したがって、Direct2D で使用する DDS イメージを作成する場合は、次の制限に留意する必要があります。

  • 次の DXGI_FORMAT 値のみを使用できます。
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • 事前乗算されたアルファ データを使用する必要があります。 これには、事前乗算アルファ (DXT1、DXT2、DXT4) を明示的に定義する形式を使用する従来の DDS ファイルと、DDS_ALPHA_MODE_OPAQUE値とDDS_ALPHA_MODE_PREMULTIPLIED値を持つDDS_HEADER_DX10構造を使用する DDS ファイルが含まれます。
  • X と Y の次元は、4 ピクセルの倍数である必要があります。
  • ボリューム テクスチャ、キューブマップ、ミップマップ、またはテクスチャ配列は使用できません。 単一フレームのソース イメージのみを使用する必要があります。

ブロック圧縮アセットの生成

ブロック圧縮 DDS ファイルを作成または変換するために使用できるさまざまな DDS オーサリング ツールがあります。 前のセクションで詳しく説明したように、すべてのツールで Direct2D で DDS ファイルを使用するための要件がサポートされているわけではありません。

Visual Studio 2013以降、Visual Studio で JPEG や PNG などの既存のビジュアル アセットを、ビルド プロセスの自動部分として適切な DDS ブロック圧縮形式に変換できます。 これは、イメージ コンテンツ タスクのカスタム ビルド ステップを使用して行います。

プロジェクトに対してこれを設定する方法については、「 How to: Export a Texture for Use with Direct2D or Javascipt Apps」を参照してください。

Direct2D API

Direct2D は、次のピクセル形式をサポートするためにWindows 8.1で更新されます。

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

上記の形式では、事前乗算されたアルファを使用する必要があります。 また、これらの形式は、ターゲットではなく、ソースとして使用する場合にのみ有効です。 たとえば、つまり、BC1 を使用して Direct2D ビットマップを作成できますが、デバイス コンテキストは作成できません。

BC 形式をサポートするために、次のメソッドがWindows 8.1で更新されます。

CreateBitmapFromWicBitmapIWICBitmapSource をインターフェイスとして受け取ります。ただし、Windows 8.1 WIC では、IWICBitmapSource からのブロック圧縮データの取得はサポートされておらず、DXGI_FORMAT_BC1_UNORMなどに対応する WIC ピクセル形式はありません。代わりに、CreateBitmapFromWicBitmap、IWICBitmapSource が有効な DDS IWICBitmapFrameDecode であるかどうかを判断し、ブロック圧縮データを直接読み込みます。 D2D1_BITMAP_PROPERTIES1構造体でピクセル形式を明示的に指定するか、Direct2D が正しい形式を自動的に決定できるようにします。

Windows イメージング コンポーネント API

Windows イメージング コンポーネント (WIC) は、Windows 8.1に新しい DDS コーデックを追加します。 さらに、ブロック圧縮ピクセル データなど、DDS 固有のデータへのアクセスをサポートする新しいインターフェイスが追加されます。

圧縮 WIC ピクセル形式をブロックする

Windows 8.1には、新しい WIC ブロック圧縮ピクセル形式はありません。 代わりに、DDS デコーダーから IWICBitmapFrameDecode を取得し、 CopyPixels を呼び出すと、WICPixelFormat32bppPBGRA などの標準の非圧縮ピクセルを受け取ります。 IWICDdsFrameDecode::CopyBlocks を使用して、DDS ファイルからメモリ バッファーの形式で生ブロック圧縮データを取得できます。

マルチフレーム DDS アクセス

DDS ファイル形式を使用すると、複数の関連するイメージを 1 つのファイルに格納できます。 たとえば、DDS ファイルにはキューブマップ、ボリューム テクスチャ、またはテクスチャ配列を含めることができます。これらはすべて mipmapped できます。 Direct3D では、これらの複数のイメージがサブリソースとして公開されます。 WIC では、複数のイメージがフレームとして公開されます (IWICBitmapFrameDecodeIWICBitmapFrameEncode)。

WIC ではフレームの 1 次元配列の概念のみがサポートされますが、DDS では 3 つの独立した次元がサポートされます (ただし、任意の 1 つのファイルで使用できるのは 2 つだけです)。 WIC には、DDS サブリソースと WIC フレーム間のマッピングを支援する便利な方法が用意されています。 デコードの場合、 IWICDdsDecoder::GetFrame を使用すると、サブリソースの配列インデックス、mip レベル、スライス インデックスを指定し、正しい WIC フレームを返すことができます。

エンコードの場合、 IWICDdsEncoder::CreateNewFrame は 、新しいフレームを作成するときに、結果の配列インデックス、mip レベル、スライス インデックスを計算します。 DDS 固有のファイル パラメーターを定義するには、まず IWICDdsEncoder::SetParameters を呼び出す必要があります。

方法: Direct2D または Javascipt アプリで使用するためのテクスチャをエクスポートする

DDS のリファレンス

ブロック圧縮