日別アーカイブ: 2012年8月21日

OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC

DXTC(S3TC)/PVRTC/ETC1/ETC2 など、4×4 block を 64bit 単位で
変換する圧縮テクスチャフォーマットが第一世代なら、
128bit 単位で処理する BC6H/BC7 (BPTC) は第二世代の新しい
圧縮テクスチャフォーマットと言えます。

64bit の枠を超えた余剰 bit を、モード分岐やパーティション分割等
画質を向上させるための様々な情報として用います。

ASTC も同様で、BC6H/BC7(BPTC) と同じように 128bit 単位で圧縮を
行います。その仕組はさらに複雑でより踏み込んだ内容でした。

 ・128bit 単位
 ・複雑なモード分岐
 ・Dual Plane 機能 (Index を 2セット持つ)
 ・Partition 分割 (カラーセット Endpoint を複数持つ)

これらの特徴は BC6H/BC7(BPTC) と共通のものです。
ASTC にはさらに独自の仕様が多数含まれています。

 ・可変 Block サイズ (4×4 ~ 12×12)
 ・最大 4分割 の Partition (BPTC は 3分割まで)
 ・2,3,5 の 3種類の基数選択
 ・1~4 component の自由なフォーマット (R,RG,RGB,RGBA)

Khronos の仕様では LDR モードのみ定義されていますが、
ARM のドキュメントでは 3D texture や HDR まで言及されており
より幅広い用途が想定されていたことがわかります。

KHR_texture_compression_astc_ldr
ARM Mali developer Center: ASTC Evaluation Codec

bit field は非常に自由で、モードと Endpoint (代表カラー値) が
下位 bit から、Index (Texel Weight) が上位 bit から必要個数並ぶという
可変フォーマットです。
そのため組み合わせ数は膨大で単純なモード数では表現できません。

また 2進数からくる制約が少ないのも大きな特徴の一つです。
例えば block サイズも 5×5 , 6×6 , 10×8 など中途半端なサイズを
選ぶことができます。
Index によるカラーの補間も、DXT 等では 2bit なので 4段階ですが、
ASTC では 3値や 5値等の任意の段階を選ぶことができます。

DXT では 2色の代表カラーを選んでも、4階調だとちょうど中間の値を
生成することができません。画像によっては都合が悪く、敢えて
DXT1 の 3色モード (Alpha 1bit) を用いることがありました。

ASTC は 3 と 5 の基数を用いることができます。
5つの 3階調値を 8bit (3^5 = 243) に格納し、同様に 3つの 5階調値を
7bit (5^3 = 125) に収めます。
これに任意ビット数のスケール値を掛けることで、2 の n 乗に制限されず
下記の値の範囲を格納することができます。

 3 (0-2) =  3  + 0bit
 4 (0-3) =       2bit
 5 (0-4) =  5  + 0bit
 6 (0-5) =  3  + 1bit = 3 * 2
 8 (0-7) =       3bit
10 (0-9) =  5  + 1bit = 5 * 2
12 (0-11)=  3  + 2bit = 3 * 4
 :

例えば 12 (0~11) 段階をエンコードするなら 5個単位で格納します。
それぞれが 2bit のスケールを持つので、8bit + 5*2bit = 18bit (5個分)
となります。

このようにより自由なエンコードアルゴリズムを用いつつ、かつハードウエアで
実装しやすいようさまざまな工夫が施されています。

関連エントリ
OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)
Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (1)
OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
OpenGL の圧縮テクスチャ (2) 法線圧縮
Android OpenGL ES 2.0 の圧縮テクスチャ