こんにちは。ウェブテクノロジの清水です。
米Net Applications社の調査によると、Windows XPは2014年4月の時点でも26.3%と高いシェアを保ってるようです。しかし、いくらユーザが残っているとはいえ、末端の開発者がサポートが終了したOSの面倒をいつまでも見ているわけにもいきません。
最近ではWindowsアプリケーションの動作対象OSからWindows XPが外されることも普通のことになり、ようやくWindows XPの束縛から解放された、と内心安堵している開発者の方も多いのではないでしょうか。
そして、3D系アプリの最低動作環境の見直しとなると、Windows Vistaは飛ばして、Windows 7とDirectX 11を最低動作環境にする、という選択もそれほど無茶ではないように思えます。
今回は、DirectX 11で利用可能な圧縮テクスチャについて、解説いたします。
DirectX 11では、BC1~BC7(BC1、BC2、BC3、BC4、BC5、BC6H、BC7)の7種類の圧縮テクスチャが利用可能ですが、それぞれが実際にどのような圧縮フォーマットなのかという点についてはあまり詳しく知られていないようです。
今回は「前編」として、概要とBC1~BC5までを解説します。
概要
BC1~BC7のBCというのはブロック圧縮(Block Compression)の略で、画像を4×4ピクセル単位のブロックに分割して、それぞれのブロック毎に圧縮を行う方式です。
BC1~BC7という名前はDirectX固有の呼び方で、以下の表のように、それぞれに適した用途があります。
表1 BC1~BC7の用途
形式名 | bpp | 用途 | 備考 |
---|---|---|---|
BC1 | 4 | RGB画像、または RGBA画像(二値アルファ) | DXT1の代替 |
BC2 | 8 | RGBA画像(16階調アルファ) | DXT2~3の代替 |
BC3 | 8 | RGBA画像(多階調アルファ) | DXT4~5の代替 |
BC4 | 4 | 1成分のデータ(ハイトマップ等) | ATI1Nの代替 |
BC5 | 8 | 2成分のデータ(法線マップ等) | ATI2N(3Dc)の代替 |
BC6H | 8 | HDR(ハイダイナミックレンジ)のRGB画像 | |
BC7 | 8 | RGB画像、または RGBA画像(多階調アルファ) |
※圧縮データは4×4ピクセル単位のブロック(4bpp では8バイト、8bpp では16バイト)
- BC1~7の圧縮は非可逆圧縮なので、データを圧縮する際には劣化が発生します。
- DirectX 11対応のGPUでは、BC1~BC7をGPUのハードウェアがサポートしています。
- DirectX 10以降では、テクスチャ形式の呼び方が一新されており、DirectX 9までのDXT1~DXT5という呼び方はしなくなりました。
- DirectX用のテクスチャファイルを格納するためのDDSファイルもDirectX 10以降でフォーマットが拡張されており、DirectX 10以降のテクスチャ形式で保存したDDSファイル(DX10拡張DDS)は、それ以前の(DirectX 9用の)DDSファイルとバイナリ互換性がなくなっています。
このため、DDSファイルをサポートしてるツールでも、DX10拡張DDS については扱えない場合が多いので注意が必要です。
BC1
- BC1は、DirectX 9ではDXT1と呼ばれていた圧縮テクスチャ形式と同等のもので、RGBのカラー値と1ビットのアルファ(完全透明と完全不透明のみの二値アルファ)を表現できる圧縮テクスチャ形式です。
- BC1には、表現するRGB値がリニアなBC1_UNORMと、RGB値がsRGBのBC1_UNORM_SRGBの2つのテクスチャ形式が用意されています。この形式の違いは表現するRGB値の色空間の識別のためで、圧縮アルゴリズム自体は共通です(他にもう1つ、BC1_TYPELESSという「型無し」のBC1のテクスチャ形式がありますが、通常は使用しません)。
- BC1では、4×4ピクセルの無圧縮のRGBデータ(48バイト)を8バイトに圧縮するので、圧縮率は1/6になります(アルファ付きの4×4ピクセルの無圧縮のRGBA データは64バイトなので、圧縮率が1/8と表記される場合もあります)。
- BC1は、4×4ピクセルの画像データをRGB565形式の代表色2色と、その中間の補間色(2色または1色+透明) の計4色(または計3色+透明)で表す、比較的シンプルな圧縮データです。
表2 BC1の圧縮データ構造(1ブロック)
2バイト | 代表色0(RGB565) |
2バイト | 代表色1(RGB565) |
4バイト | ピクセル毎のインデックス値(各2ビット) |
- BC1は、4×4ピクセル内で色調が大きく変わらない画像に対しては優れた色再現性を持ちますが、4×4ピクセル内で色調が大きく変わる部分を持つ画像では、圧縮による劣化がブロック状のノイズとなって見えてしまうという欠点があります。
- マイクロソフト社のツールでDDSファイルに変換する場合、デフォルト設定では、BC1_UNORMは従来の(DirectX 9互換の)DXT1 形式で、BC1_UNORM_SRGBはDX10拡張DDSで保存されるようになっています。
BC2
- BC2は、DirectX 9ではDXT2やDXT3と呼ばれていた圧縮テクスチャ形式と同等のもので、RGBのカラー値と、4ビット精度(16階調)のアルファを表現できる圧縮テクスチャ形式です。
- BC2には、表現するRGB値がリニアなBC2_UNORMと、RGB値がsRGBのBC2_UNORM_SRGBの2つのテクスチャ形式が用意されています。この形式の違いは、表現するRGB値の色空間の識別のためで、圧縮アルゴリズム自体は共通です(他にもう1つ、BC2_TYPELESSという「型無し」のBC1のテクスチャ形式がありますが、通常は使用しません)。
- BC2ではアルファ付きの4×4ピクセルの無圧縮のRGBAデータ(64バイト)を16バイトに圧縮するので、圧縮率は1/4になります。
- BC2の圧縮データは、BC1のデータ構造の前にアルファ値のデータを格納した形になっています。
表3 BC2の圧縮データ構造(1ブロック)
8バイト | 各ピクセル毎のアルファ値(各4ビット) |
2バイト | 代表色0 (RGB565) |
2バイト | 代表色1 (RGB565) |
4バイト | ピクセル毎のインデックス値(各2ビット) |
- BC2では各ピクセルのアルファ値は16階調に制限されますが、16階調の中からピクセル単位で任意の値を選択できるため、アルファが16階調でも十分であることが判っている場合や、アルファ値が大きく偏って分散していてBC3ではブロック状の劣化ノイズが目立つ場合だけBC2を使用する、という使い方が一般的です
BC3
- BC3は、DirectX 9ではDXT4やDXT5と呼ばれていた圧縮テクスチャ形式と同等のもので、RGBのカラー値と多階調のアルファを表現できる圧縮テクスチャ形式です。
- BC3には、表現するRGB値がリニアなBC3_UNORMと、RGB値がsRGBのBC3_UNORM_SRGBの2つのテクスチャ形式が用意されています。この形式の違いはRGB値の色空間の識別のためで、圧縮アルゴリズム自体は共通です(他にもう1つ、BC3_TYPELESSという「型無し」のBC3のテクスチャ形式がありますが、通常は使用しません)。
- BC3の圧縮データは、BC1のデータ構造の前にアルファ値のデータを格納した形になっています。BC3ではアルファ付きの4×4ピクセルの無圧縮のRGBAデータ(64バイト)を16バイトに圧縮するので、圧縮率は1/4になります。アルファ値の格納方法は、各ピクセル独立ではなく、BC1のRGB 値の圧縮データに似た代表値とインデックス値のセットになっています。
表4 BC3の圧縮データ構造(1ブロック)
1バイト | アルファの代表値0 |
1バイト | アルファの代表値1 |
6バイト | ピクセル毎のインデックス値(各3ビット) |
2バイト | 代表色0 (RGB565) |
2バイト | 代表色1 (RGB565) |
4バイト | ピクセル毎のインデックス値(各2ビット) |
- BC3では代表値2個を直線補間し、間の6個(または4個) の補間値を計算してアルファチャンネルを表現するため、グラデーションがかかったような滑らかな変化のあるアルファチャンネルを持つ画像の表現に適しています。しかし、アルファ値が急激に変化する透明境界部分などでは、アルファチャンネルにブロック状の劣化ノイズが発生しやすくなります。
- BC3で圧縮すると、アルファが0で完全に透明だったピクセルのアルファ値が1以上になって、見えないはずのピクセルがうっすらと見えたり、逆に、アルファが255で完全に不透明だったピクセルのアルファ値が255未満になり、背景がうっすらと透けてしまう、などの問題が起きる場合があります。
- アルファ付きの画像の場合は通常はBC3を使い、ブロック状の劣化ノイズの発生状況によっては、BC2やBC1でよい場合はそれらを選択する、という使い分けが適しています。
- DXT1~DXT5の圧縮アルゴリズムについては、既に当ブログにも解説記事がありますので、こちらも併せてご覧ください。
- BC1~BC3の詳細仕様については、マイクロソフト社の開発者向けページをご覧ください。
BC4
- BC4はDirectX 10で追加された圧縮テクスチャ形式で、輝度データやアルファチャンネルやハイトマップなど、1成分(1チャンネル)の情報だけを格納するためのものです。1成分のデータ用の圧縮フォーマットであるため、通常のRGBカラー画像の格納には使用しません。
- BC4の圧縮データは、DirectX 9時代にATI1N(またはATI1)と呼ばれていた圧縮テクスチャ形式と基本的には同じものです。OpenGLではBC4と同様の圧縮フォーマットがRGTC(またはRGTC1)と呼ばれています。
- BC4には、表現できる値の範囲が0.0~1.0のBC4U(BC4_UNORM)というテクスチャ形式と、表現できる値の範囲が-1.0~1.0のBC4S(BC4_SNORM)というテクスチャ形式の2種類があります(他にBC4_TYPELESSという「型無し」のBC4のテクスチャ形式がありますが、通常は使用しません)。
- BC4では、圧縮は4×4ピクセル毎に行われ、4×4ピクセルの1成分の無圧縮の16バイトの情報を8バイトに圧縮しますので、圧縮率は1/2になります。
- BC4のデータ格納形式は、BC3(DXT5)のアルファチャンネル部分の圧縮データの格納形式と同じで、1バイトの代表値を2個と、4×4ピクセルの各ピクセル毎に3ビットのインデックス値を持ちます。
表5 BC4の圧縮データ構造(1ブロック)
1バイト | 代表値0 |
1バイト | 代表値1 |
6バイト | 各ピクセル毎のインデックス値(各3ビット) |
- BC4がBC3のアルファチャンネル部分の圧縮アルゴリズムと違う点は、表現する値が0~255の8ビット値ではなく、0.0~1.0(BC4Uの場合)の範囲、または、-1.0~1.0(BC4Sの場合)の範囲の値を表すテクスチャ形式であることと、補間計算が8ビットよりも少し高い精度で行われることです。
BC5
- BC5はDirectX 10で追加された圧縮テクスチャ形式で、法線マップ(ノーマルマップ)などのような2成分(2チャンネル)の情報を格納するためのものです。2成分のデータ用の圧縮テクスチャ形式であるため、通常のRGBカラー画像の格納には使用しません。
- BC5の圧縮データ構造は、DirectX 9時代にATI2N(またはATI2)や3Dc、あるいはDXNと呼ばれていた圧縮テクスチャ形式と基本的には同じものです。OpenGLではBC5と同様の圧縮フォーマットがRGTC(またはRGTC2)と呼ばれています。
- BC5には、表現できる値の範囲が0.0~1.0のBC5U(BC5_UNORM)というテクスチャ形式と、表現できる値の範囲が-1.0~1.0のBC5S(BC5_SNORM)というテクスチャ形式の2種類があります(他にBC5_TYPELESSという「型無し」のBC5のテクスチャ形式がありますが、通常は使用しません)。
- BC5は、4×4ピクセルの1ブロック単位でBC4の圧縮データをちょうど2個使うような構造になっています。
表6 BC5の圧縮データ構造(1ブロック)
1バイト | 成分1の代表値0 |
1バイト | 成分1の代表値1 |
6バイト | 成分1の各ピクセル毎のインデックス値(各3ビット) |
1バイト | 成分2の代表値0 |
1バイト | 成分2の代表値1 |
6バイト | 成分2の各ピクセル毎のインデックス値(各3ビット) |
- BC5では、圧縮は4×4ピクセル毎に行われ、4×4ピクセルの2成分の無圧縮の32バイトの情報を16バイトに圧縮しますので、圧縮率は1/2になります。
- BC5では表現できる値の精度はBC4と同様にあまり高くありませんので、1成分につき8ビット程度の精度で十分な用途にしか使えません。
- 法線マップは本来はx,y,zの3成分が必要ですが、正規化されているベクトルは2成分の値が判れば残りの1成分を計算で求められるので(誤差は大きくなりますが)、法線マップ用のデータとしては2成分のみを記録しておくだけで済みます。
このため、BC5は、法線マップを圧縮して格納するのに適しています。
BC6 とBC7 については、後編でご説明します。