Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)

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 の圧縮テクスチャ