引き続きテクスチャ圧縮フォーマット BC6H の詳細構造です。(前回)
8bit を前提にした BC7 と違い、BC6H は 16bit までの HDR コンポーネントを
格納することが出来ます。
BC7 同様 4×4 block を複数の領域に分割出来ますが、分割数は 2までで
分割パターンも 32通りとなります。
エンコード方法も BC7 とは全く異なる構造をしています。
●BC6H のモード
4×4 block 単位で下記の 18通りのエンコードをモードを選択できます。
モード符号は 18種類ありますが、そのうち 4つは未使用。
現在定義されているのは 14種類です。
BC6H mode bit mode No ---------------------- 00 0 0 01 1 1 00010 2 2 00110 6 3 01010 10 4 01110 14 5 10010 18 6 10110 22 7 11010 26 8 11110 30 9 00011 3 10 00111 7 11 01011 11 12 01111 15 13 10011 19 14 reserved 10111 23 15 reserved 11011 27 16 reserved 11111 31 17 reserved
●BC6H の endpoint
BC6H では subset が 2つの endpoint 直値で構成されている場合と、
color0 からの差分 (offset) で格納する場合の二通り存在します。
BC7 は直値だけでした。
分割モードで差分の場合は、代表カラー1 + 差分3 になります。
・subset (補間ペア) が直値の場合 color0, color1
・subset (補間ペア) が差分の場合 color0, diff1
・subset (補間ペア) が直値かつ領域分割の場合 color0, color1, color2, color3
・subset (補間ペア) が差分かつ領域分割の場合の color0, diff1, diff2, diff3
●endpoint の符号化
endpoint (カラー値) の格納方法はモードごとに異なっており、
さらに格納場所が分散しているケースもあって非常に複雑です。
仕様書には分散する bit 集めて合成するためのテーブル (Table.F) が定義
されています。
このテーブルを読みながらデータを拾い集める必要があります。
反面、partition bit と index bit はどのモードでもほぼ固定の領域が割り当て
られており、こちらは BC7 よりもアクセスしやすいと言えます。
●BC6H の各モード詳細
BC6H mode 0 (No.0) 2分割 32通り endpoint: RGB(10,10,10) + d(5,5,5) x3 index: 3bit (8段階) 2bit mode 指定 25bit R0 10bit + Rn 5bit x 3 25bit G0 10bit + Gn 5bit x 3 25bit B0 10bit + Bn 5bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 1 (No.1) 2分割 32通り endpoint: RGB(7,7,7) + d(6,6,6) x3 index: 3bit (8段階) 2bit mode 指定 25bit R0 7bit + Rn 6bit x 3 25bit G0 7bit + Gn 6bit x 3 25bit B0 7bit + Bn 6bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 2 (No.2) 2分割 32通り endpoint: RGB(11,11,11) + d(5,4,4) x3 index: 3bit (8段階) 5bit mode 指定 26bit R0 11bit + Rn 5bit x 3 23bit G0 11bit + Gn 4bit x 3 23bit B0 11bit + Bn 4bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 6 (No.3) 2分割 32通り endpoint: RGB(11,11,11) + d(4,5,4) x3 index: 3bit (8段階) 5bit mode 指定 23bit R0 11bit + Rn 4bit x 3 26bit G0 11bit + Gn 5bit x 3 23bit B0 11bit + Bn 4bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 10 (No.4) 2分割 32通り endpoint: RGB(11,11,11) + d(4,4,5) x3 index: 3bit (8段階) 5bit mode 指定 23bit R0 11bit + Rn 4bit x 3 23bit G0 11bit + Gn 4bit x 3 26bit B0 11bit + Bn 5bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 14 (No.5) 2分割 32通り endpoint: RGB(9,9,9) + d(5,5,5) x3 index: 3bit (8段階) 5bit mode 指定 24bit R0 9bit + Rn 5bit x 3 24bit G0 9bit + Gn 5bit x 3 24bit B0 9bit + Bn 5bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 18 (No.6) 2分割 32通り endpoint: RGB(8,8,8) + d(6,5,5) x3 index: 3bit (8段階) 5bit mode 指定 26bit R0 8bit + Rn 6bit x 3 23bit G0 8bit + Gn 5bit x 3 23bit B0 8bit + Bn 5bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 22 (No.7) 2分割 32通り endpoint: RGB(8,8,8) + d(5,6,5) x3 index: 3bit (8段階) 5bit mode 指定 23bit R0 8bit + Rn 5bit x 3 26bit G0 8bit + Gn 6bit x 3 23bit B0 8bit + Bn 5bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 26 (No.8) 2分割 32通り endpoint: RGB(8,8,8) + d(5,5,6) x3 index: 3bit (8段階) 5bit mode 指定 23bit R0 8bit + Rn 5bit x 3 23bit G0 8bit + Gn 5bit x 3 26bit B0 8bit + Bn 6bit x 3 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 30 (No.9) 2分割 32通り endpoint: RGB(6,6,6) x 4 index: 3bit (8段階) 5bit mode 指定 24bit R 6bit x 4 24bit G 6bit x 4 24bit B 6bit x 4 5bit partition 指定、32種類 46bit index (3bit x14 + 2bit x 2) BC6H mode 3 (No.10) 分割なし endpoint: RGB(10,10,10) x 2 index: 4bit (16段階) 5bit mode 指定 10bit R 10bit x 2 10bit G 10bit x 2 10bit B 10bit x 2 63bit index (4bit x15 + 3bit x1) BC6H mode 7 (No.11) 分割なし endpoint: RGB(11,11,11) + d(9,9,9) index: 4bit (16段階) 5bit mode 指定 20bit R0 11bit + R1 9bit 20bit G0 11bit + G1 9bit 20bit B0 11bit + B1 9bit 63bit index (4bit x15 + 3bit x1) BC6H mode 11 (No.12) 分割なし endpoint: RGB(12,12,12) + d(8,8,8) index: 4bit (16段階) 5bit mode 指定 20bit R0 12bit + R1 8bit 20bit G0 12bit + G1 8bit 20bit B0 12bit + B1 8bit 63bit index (4bit x15 + 3bit x1) BC6H mode 15 (No.13) 分割なし endpoint: RGB(16,16,16) + d(4,4,4) index: 4bit (16段階) 5bit mode 指定 20bit R0 16bit + R1 4bit 20bit G0 16bit + G1 4bit 20bit B0 16bit + B1 4bit 63bit index (4bit x15 + 3bit x1)
●パーティションテーブル
分割パターンはプリセットなので、実際にエンコード&デコードする場合は
テーブルが必要です。
テーブルは BC7 と共用で、BC6H は 2分割用 64個種類のうち前半 32個だけ使います。
●bit パターン例
BC7 mode0 partition 0 128bit
H---------------------------------L g0 r5 r4 r3 r2 r1 r0 Pt M GGGrrrrR RRRrrrrR RRRrrrrR RRRPPPP1 bit 31..0 b2 b1 b0 g5 g4 g3 g2 g1 BBBbbbbB BBBggggG GGGggggG GGGggggG bit 63..32 ___--___ ---__ P-bit b5 b4 b3 IIIiiIII iiiIIPPP PPPbbbbB BBBbbbbB bit 95..64 __---___ ---___-- -___---_ __---___ iiIIIiii IIIiiiII IiiiIIIi iiIIIiii bit 127..96
BC6H mode0 partition 0 128bit
H---------------------------------L b0 g0 r0VTU M BBBBBBBG GGGGGGGG GRRRRRRR RRRvtu00 bit 31..0 b2V b1 g3V g1 g2W r1 BBBvbbbb bGGGGvgg gggGGGGw rrrrrBBB bit 63..32 __---___ ---___ Pt V r3V r2 IIiiiIII iiiIIIPP PPPvrrrr rvRRRRRB bit 95..64 __---___ ---___-- -___---_ __---__ IIiiiIII iiiIIIii iIIIiiiI IIiiiIII bit 127..96 U=g2, T=b2, W=g3, V=b3
BC6H の例で U,T,W はそれぞれ g2,b2,g3 の一部ビットです。
5箇所に点在している V は b3 です。
●フォーマット
BC6H/BC7/BPTC は予想より複雑な構造をしています。
それでも格納されるデータの構造がある程度わかれば、エンコードフォーマットを
選択する場合の判断材料として役に立つでしょう。
関連エントリ
・Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)
・OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
・OpenGL の圧縮テクスチャ (2) 法線圧縮
・Android OpenGL ES 2.0 の圧縮テクスチャ