月別アーカイブ: 2011年3月

Photoshop dds plug-in x64 版

テクスチャ用の画像フォーマットには ktx もあります。
OpenGL で使う場合はデコードの負担が少なく使いやすい内容ですが、
対応ツールの多さを考えてもまだまだ dds の出番は無くなりません。

Photoshop 用の dds plug-in は NVIDIA 製のものが有名です。
やっと 64bit 版が出ました。

NVIDIA Plug-ins for Adobe Photoshop

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

引き続きテクスチャ圧縮フォーマット 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 の圧縮テクスチャ