BC6H/BC7/BPTC は GPU が対応しているテクスチャ圧縮の進化系です。
DXT よりも柔軟な bit 配置が可能で圧縮画質が向上しています。(前回)
その block 構造を調べてみました。
参考にした資料は下記の 2つです。
・ARB_texture_compression_bptc
・BC6HBC7EncoderDecoder11 Sample
基本的な考え方は S3TC(DXT) と同じです。
S3TC の場合 4×4 block 単位で基準となる 2つのカラー値を保持します。
この 2色を補間し 3 または 4 階調のカラーをパレットを生成します。
4×4 block の各 pixel は 2bit の index を持っており、生成されたパレットから
1色を選択します。
BPTC/BC6H/BC7 では格納されているカラーが endpoint、補間に用いる 2色のペアが
subset と呼ばれています。さらにさまざまな工夫が施されています。
●領域分割
4×4 block を複数の領域に分割して、領域ごとに補間カラー (subset) を持つことが
できます。分割数は BC6H で 2領域まで、BC7 では 3領域まで可能です。
例えば BC7 で 3領域存在している場合、それぞれが 2つのカラー (endpoint)
持っているため独立した RGB 値を 6色分保持していることになります。
例
・領域0 = color0 color1 の補間 から 1色選択
・領域1 = color2 color3 の補間 から 1色選択
・領域2 = color4 color5 の補間 から 1色選択
分割方法は自由に選べるわけではなく、プリセットされた分割パターンから選択
することになります。
●P-bit
BC7 では格納されているカラー値の精度を稼ぐために RGB で共有された追加ビットを
加えることが出来ます。
例えば RGB それぞれ 5bit で格納されている場合、下記のように最下位に P-bit
が追加されて 6bit になります。
H----L R= RRRRRP G= GGGGGP B= BBBBBP
(この例の場合 SHARP X68000 の 16bit mode VRAM 構造 555I と同じです。)
●分割パターン
4×4 block を複数の領域 (partition) に分割して、それぞれ異なるカラー値
(endpoint) を参照することが出来ます。
BC7 の場合 2分割で 64通り、3分割で 64通りの 128種類存在します。
・BC7
分割なし
2分割、64通りから選択
3分割、16通りから選択
3分割、64通りから選択
・BC6H
分割なし
2分割、32通りから選択
●インデックス長
インデックス長は 2bit, 3bit, 4bit の 3通りあり、それぞれカラー補間によって
パレットが 4階調、8階調、16階調に展開されます。
インデックスサイズはモードによって異なります。
圧縮のために、一部のピクセルでは全階調から選択できないことがあります。
例えば BC7 mode 0 は 3bit index なので 8階調ありますが、先頭 pixel の
インデックスは 2bit しかなく前半の 4階調しか選択できません。
●独立インデックス
BC7 の Alpha 付きモードでは DXT3/DXT5 のように 16個の index を 2セット
保持することが可能です。共有するモードもあります。
・カラーとアルファのインデックスを共有
それぞれ 16個の index があり独立している。合計 32個
・カラーとアルファのインデックスを共有
16個のインデックスのみ
●独立インデックスの入れ替え
BC7 の Alpha 独立インデックスでは RGB が共有されます。
rotation モード指定により、特別扱いするチャンネル (component) を
Alpha 以外にも設定できます。
例えば BC7 mode 4 で rotation = 1 の場合 BGA が共有され、R のみ独立した
専用の index 参照が可能となります。
●BC7 のモード
選択可能な分割パターン、格納するカラー(endpoint) の bit サイズ等、画像に
合わせていくつかの組み合わせから選択することが出来ます。
BC7 では下記の 8モードが定義されています。4×4 block 単位で任意のモードを
選択することが可能です。
BC7 mode bit mode0 = 1 mode1 = 10 mode2 = 100 mode3 = 1000 mode4 = 10000 mode5 = 100000 mode6 = 1000000 mode7 = 10000000
モード符号化の構造的上、モード数を拡張することが可能ですがデータの格納
効率は落ちます。
●BC7 の各モードの詳細
BC7 はモードごとに異なる複雑な bit 配置を取りますが、データは順番に詰めて
格納されるため BC6H のように飛び飛びの bit を拾い集める必要がありません。
BC7 mode 0 3分割 16通り endpoint: RGB 444 x6色 (subset x3) + P-bit index: 3bit (8段階) 1bit mode 指定 4bit partition 指定、16種類 24bit R 4bit x 6 24bit G 4bit x 6 24bit B 4bit x 6 6bit P-bit 1bit x 6 45bit index (3bit x13 + 2bit x3) BC7 mode1 2分割 64通り endpoint: RGB 666 x4色 (subset x2) + P-bit (shared) index: 3bit (8段階) 2bit mode 指定 6bit partition 指定、64種類 24bit R 6bit x 4 24bit G 6bit x 4 24bit B 6bit x 4 1bit shared P-bit 47bit index (3bit x14 + 2bit x1) BC7 mode2 3分割 64通り endpoint: RGB 555 x6色 (subset x3) index: 2bit (4段階) 3bit mode 指定 6bit partition 指定、64種類 30bit R 5bit x 6 30bit G 5bit x 6 30bit B 5bit x 6 29bit index (2bit x13 + 1bit x3) BC7 mode3 2分割 64通り endpoint: RGB 777 x4色 (subset x2) + P-bit index: 2bit (4段階) 4bit mode 指定 6bit partition 指定、64種類 28bit R 7bit x 4 28bit G 7bit x 4 28bit B 7bit x 4 4bit P-bit 1bit x 4 30bit index (2bit x14 + 1bit x2) BC7 mode4 分割なし endpoint: RGBA 5556 x2色 (subset x1) index: 2bit (4段階), 3bit (8階調) 5bit mode 指定 2bit rotation 指定 (A→RGB 入れ替え) 1bit Index 選択 (color 4段 + alpha 8段 or color8段 + alpha 4段) 10bit R 5bit x 2 10bit G 5bit x 2 10bit B 5bit x 2 12bit A 6bit x 2 31bit index (2bit x15 + 1bit x1) 47bit index (3bit x14 + 2bit x1) BC7 mode5 分割なし endpoint: RGBA 7778 x2色 (subset x1) index: 2bit (4段階) x2 6bit mode 指定 2bit rotation 指定 (A→RGB 入れ替え) 14bit R 7bit x 2 14bit G 7bit x 2 14bit B 7bit x 2 16bit A 8bit x 2 31bit index (2bit x15 + 1bit x1) 31bit index (2bit x15 + 1bit x1) BC7 mode6 分割なし endpoint: RGBA 7777 x2色 (subset x1) + P-bit index: 4bit (16段階) 7bit mode 指定 14bit R 7bit x 2 14bit G 7bit x 2 14bit B 7bit x 2 14bit A 7bit x 2 2bit P-bit 1bit x 2 63bit index (4bit x15 + 3bit x1) BC7 mode7 2分割 64通り endpoint: RGBA 5555 x4色 (subset x2) + P-bit index: 2bit (4段階) 8bit mode 指定 20bit R 5bit x 4 20bit G 5bit x 4 20bit B 5bit x 4 20bit A 5bit x 4 4bit P-bit 1bit x 4 30bit index (2bit x14 + 1bit x2)
続きます。
関連エントリ
・OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
・OpenGL の圧縮テクスチャ (2) 法線圧縮
・Android OpenGL ES 2.0 の圧縮テクスチャ