次の方法で共有


ブロック圧縮

Windows 8.1 以降、Direct2D では複数のブロック圧縮ピクセル形式がサポートされています。 さらに、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 ピクセルのブロックに分割されます。 各ブロックは個別に圧縮されます。

手記

つまり、ブロック圧縮するには、イメージの幅と高さが 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

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

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

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

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

DirectDraw Surface (DDS) ファイル形式

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

ブロック圧縮の利点

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

ブロック圧縮を使用する場合

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

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

第二に、ブロック圧縮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 ピクセルの倍数である必要があります。
  • ボリューム テクスチャ、キューブマップ、ミップマップ、またはテクスチャ配列は使用できません。 1 つのフレーム ソース イメージのみを使用する必要があります。

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

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

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

プロジェクトに対してこれを設定する方法については、「方法: Direct2D または 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 が IWICBitmapFrameDecode有効な DDS であるかどうかを判断し、ブロック圧縮データを直接読み込みます。 D2D1_BITMAP_PROPERTIES1 構造体でピクセル形式を明示的に指定するか、Direct2D で正しい形式を自動的に決定することができます。

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

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

  • IWICDdsDecoder
  • IWICDdsEncoder
  • IWICDdsFrameDecode

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

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

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

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

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

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

方法: Direct2D または Javascipt Apps で使用するテクスチャをエクスポートする

DDS リファレンス

ブロック圧縮