BC6H/BC7/BPTC は GPU が対応しているテクスチャ圧縮の進化系です。
DXT よりも柔軟な bit 配置が可能で圧縮画質が向上しています。(前回)
その block 構造を調べてみました。
参考にした資料は下記の 2つです。
・ARB_texture_compression_bptc
・BC6HBC7EncoderDecoder11 Sample
基本的な考え方は S3TC(DXT) と同じです。
S3TC の場合 4x4 block 単位で基準となる 2つのカラー値を保持します。
この 2色を補間し 3 または 4 階調のカラーをパレットを生成します。
4x4 block の各 pixel は 2bit の index を持っており、生成されたパレットから
1色を選択します。
BPTC/BC6H/BC7 では格納されているカラーが endpoint、補間に用いる 2色のペアが
subset と呼ばれています。さらにさまざまな工夫が施されています。
●領域分割
4x4 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 になります。
(この例の場合 SHARP X68000 の 16bit mode VRAM 構造 555I と同じです。)
●分割パターン
4x4 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モードが定義されています。4x4 block 単位で任意のモードを
選択することが可能です。
モード符号化の構造的上、モード数を拡張することが可能ですがデータの格納
効率は落ちます。
●BC7 の各モードの詳細
BC7 はモードごとに異なる複雑な bit 配置を取りますが、データは順番に詰めて
格納されるため BC6H のように飛び飛びの bit を拾い集める必要がありません。
続きます。
関連エントリ
・OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
・OpenGL の圧縮テクスチャ (2) 法線圧縮
・Android OpenGL ES 2.0 の圧縮テクスチャ
DXT よりも柔軟な bit 配置が可能で圧縮画質が向上しています。(前回)
その block 構造を調べてみました。
参考にした資料は下記の 2つです。
・ARB_texture_compression_bptc
・BC6HBC7EncoderDecoder11 Sample
基本的な考え方は S3TC(DXT) と同じです。
S3TC の場合 4x4 block 単位で基準となる 2つのカラー値を保持します。
この 2色を補間し 3 または 4 階調のカラーをパレットを生成します。
4x4 block の各 pixel は 2bit の index を持っており、生成されたパレットから
1色を選択します。
BPTC/BC6H/BC7 では格納されているカラーが endpoint、補間に用いる 2色のペアが
subset と呼ばれています。さらにさまざまな工夫が施されています。
●領域分割
4x4 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 と同じです。)
●分割パターン
4x4 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モードが定義されています。4x4 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 の圧縮テクスチャ
2011/02/27
OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7
DXT1/DXT3/DXT5/ETC1 等の圧縮テクスチャは、カラー値 RGB をピクセル当たり
4bit (4bpp) に変換しています。
DXT3/5 など Alpha 付きの場合は 8bpp ですがカラー成分は 4bpp のままです。
Alpha チャンネル単独で 4bpp 分追加しています。
この垣根を無くして 8bpp 分をまるごとカラー情報に割り当てられれば、
より高品位な画像圧縮ができると考えられます。
単純に DXT1 相当と考えても、ちょうどテクスチャ 2枚分の情報を格納することが
できるわけです。4x4 エリアを 2分割してそれぞれに DXT1 相当の画素を入れたり、
保持しているベースカラーの精度を上げる事も考えられます。
Direct3D 11 で追加されたテクスチャフォーマット BC6H/BC7 はこのように
8bpp (4x4 block 128bit) を自由にリフォーマットして多くの情報を詰め込みます。
調べてみると、単に情報を増やすだけでなく画像に合わせてさまざまなモードを
選択できる自由度の高さが強みのようです。
データの格納方法もさまざまで、ベース値の精度も複数選択できます。
やはり 4x4 block は分割可能のようです。ただし ETC1 のような 4x2 ではなく
プリセットされた 32/64 通りから選べます。
その分ビット単位で情報の配置が変化するため非常に複雑な構造になっています。
・BC6H HDR 対応。16bit float に拡張
・BC7 SDR で解像度を優先
OpenGL にも BPTC と呼ばれる BC6H/BC7 相当の圧縮フォーマットが追加されています。
RADEON HD 5850 / GeForce GTX 460 で対応していることが確認できました。
実際に Direct3D 11 SDK のコンバータ texconvex で変換した bc6h_uf16/sf16/bc7
画像を OpenGL 4.1 で描画できています。
S3TC(BC1/2/3) や 3DC(BC4/5) と同じようにバイナリで互換性が保たれているようです。
OpenGL や OpenGL ES 2.0 向け GPU で使える圧縮テクスチャの種類と対応をこちらにまとめました。
・OpenGL/OpenGL ES 2.0 テクスチャフォーマットまとめ
関連エントリ
・OpenGL の圧縮テクスチャ (2) 法線圧縮
・Android OpenGL ES 2.0 の圧縮テクスチャ
4bit (4bpp) に変換しています。
DXT3/5 など Alpha 付きの場合は 8bpp ですがカラー成分は 4bpp のままです。
Alpha チャンネル単独で 4bpp 分追加しています。
この垣根を無くして 8bpp 分をまるごとカラー情報に割り当てられれば、
より高品位な画像圧縮ができると考えられます。
単純に DXT1 相当と考えても、ちょうどテクスチャ 2枚分の情報を格納することが
できるわけです。4x4 エリアを 2分割してそれぞれに DXT1 相当の画素を入れたり、
保持しているベースカラーの精度を上げる事も考えられます。
Direct3D 11 で追加されたテクスチャフォーマット BC6H/BC7 はこのように
8bpp (4x4 block 128bit) を自由にリフォーマットして多くの情報を詰め込みます。
調べてみると、単に情報を増やすだけでなく画像に合わせてさまざまなモードを
選択できる自由度の高さが強みのようです。
データの格納方法もさまざまで、ベース値の精度も複数選択できます。
やはり 4x4 block は分割可能のようです。ただし ETC1 のような 4x2 ではなく
プリセットされた 32/64 通りから選べます。
その分ビット単位で情報の配置が変化するため非常に複雑な構造になっています。
・BC6H HDR 対応。16bit float に拡張
・BC7 SDR で解像度を優先
OpenGL にも BPTC と呼ばれる BC6H/BC7 相当の圧縮フォーマットが追加されています。
RADEON HD 5850 / GeForce GTX 460 で対応していることが確認できました。
DXGI(DirectX) OpenGL ----------------------------------------------------------------------- DXGI_FORMAT_BC6H_UF16 GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB DXGI_FORMAT_BC6H_SF16 GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB DXGI_FORMAT_BC7_UNORM GL_COMPRESSED_RGBA_BPTC_UNORM_ARB DXGI_FORMAT_BC7_UNORM_SRGB GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
実際に Direct3D 11 SDK のコンバータ texconvex で変換した bc6h_uf16/sf16/bc7
画像を OpenGL 4.1 で描画できています。
S3TC(BC1/2/3) や 3DC(BC4/5) と同じようにバイナリで互換性が保たれているようです。
OpenGL や OpenGL ES 2.0 向け GPU で使える圧縮テクスチャの種類と対応をこちらにまとめました。
・OpenGL/OpenGL ES 2.0 テクスチャフォーマットまとめ
関連エントリ
・OpenGL の圧縮テクスチャ (2) 法線圧縮
・Android OpenGL ES 2.0 の圧縮テクスチャ
2011/02/20
OpenGL の圧縮テクスチャ (2) 法線圧縮
ノーマルマップの圧縮フォーマットは 3DC が有名です。
Tangent Space の法線マップの場合 z の符号が不要なので (x,y,z) のうち
x,y のみ保存しておけば z= sqrt( 1- (x*x + y*y) ) で値が求まります。
上記の通りシェーダー側に多少追加コードが必要となるものの、RGB8 24bpp
ではなく LA8/RG8 など 16bpp の画像に保存することができます。
さらに DXT5 (8bpp) の color, alpha を独立した 2チャンネルとみなして
法線圧縮する手法 (DXT5n) があります。その応用で DXT5 の alpha 圧縮の構造を
用いて独立 2チャンネルを格納するのが 3DC です。
同じように 1 チャンネルの 4bpp フォーマットもあります。
・Block Compression (Direct3D 10)
最近 OpenGL の GPU で見かける latc, rgtc も同様の構造を持った 1,2 チャンネル
圧縮フォーマットのようです。
3DC が Direct3D 10 以降 DXGI で BC4, BC5 と呼ばれているのと同様に、
OpenGL で定義された呼び方だと思われます。
LATC と RGTC の違いはチャンネルへの展開方法だけです。
RGTC は 3DC や BC5 と互換性があります。
その代わり LATC は DXT5n とシェーダーコードを共有できます。
RADEON (GL4.1) の場合いくつか注意点があります。
glGetIntegerv( GL_COMPRESSED_TEXTURE_FORMATS, lists )
が列挙を返してきません。代わりに Extension String の
glGetStringi( GL_EXTENSIONS, i ) で判定する必要があります。
また GL_ATI_texture_compression_3dc があっても OpenGL ES 2.0 と違い
rgtc の方を使います。
つまり GL_3DC_XY ではなく GL_COMPRESSED_RED_GREEN_RGTC2_EXT 。
OpenGL ES 2.0 GPU の場合 Adreno (ATI系) が 3DC、Tegra2 が LATC に対応
しています。
利用可能なカラー圧縮、法線圧縮フォーマットをまとめると下記の通りです。
対応していない GPU は非圧縮 LA8 で代用しなければなりません。
圧縮に対応していても RG(3DC) と LA でシェーダーを完全に共有するのは
難しそうです。
関連エントリ
・Android OpenGL ES 2.0 の圧縮テクスチャ
Tangent Space の法線マップの場合 z の符号が不要なので (x,y,z) のうち
x,y のみ保存しておけば z= sqrt( 1- (x*x + y*y) ) で値が求まります。
上記の通りシェーダー側に多少追加コードが必要となるものの、RGB8 24bpp
ではなく LA8/RG8 など 16bpp の画像に保存することができます。
さらに DXT5 (8bpp) の color, alpha を独立した 2チャンネルとみなして
法線圧縮する手法 (DXT5n) があります。その応用で DXT5 の alpha 圧縮の構造を
用いて独立 2チャンネルを格納するのが 3DC です。
同じように 1 チャンネルの 4bpp フォーマットもあります。
・Block Compression (Direct3D 10)
最近 OpenGL の GPU で見かける latc, rgtc も同様の構造を持った 1,2 チャンネル
圧縮フォーマットのようです。
3DC が Direct3D 10 以降 DXGI で BC4, BC5 と呼ばれているのと同様に、
OpenGL で定義された呼び方だと思われます。
ATI DX9 DX10/DXGI OpenGL ES OpenGL ------------------------------------------------------------ 3DC_X 4bpp ATI1 BC4 LATC1 LATC1/RGTC1 3DC_XY 8bpp ATI2 BC5 LATC2 LATC1/RGTC2
DX10/DXGI FourCC OpenGL ----------------------------------------------------------------------------- DXGI_FORMAT_BC4_UNORM "BC4U" GL_COMPRESSED_RED_RGTC1_EXT 0x8dbb DXGI_FORMAT_BC4_SNORM "BC4S" GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8dbc DXGI_FORMAT_BC5_UNORM "ATI2" GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8dbd DXGI_FORMAT_BC5_SNORM "BC5S" GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8dbe
LATC と RGTC の違いはチャンネルへの展開方法だけです。
RGTC は 3DC や BC5 と互換性があります。
その代わり LATC は DXT5n とシェーダーコードを共有できます。
vec4 tex_normal= texture2D( NormalMap, otexcoord ); // RGTC unsigned, 3DC_XY, RG8 tex_normal.xy= tex_normal.xy * 2.0 - 1.0; tex_normal.z= sqrt( 1.0- dot( tex_normal.xy, tex_normal.xy ) ); // LATC unsigned, DXT5n, LA8 tex_normal.xy= tex_normal.yw * 2.0 - 1.0; tex_normal.z= sqrt( 1.0- dot( tex_normal.xy, tex_normal.xy ) );
RADEON (GL4.1) の場合いくつか注意点があります。
glGetIntegerv( GL_COMPRESSED_TEXTURE_FORMATS, lists )
が列挙を返してきません。代わりに Extension String の
glGetStringi( GL_EXTENSIONS, i ) で判定する必要があります。
また GL_ATI_texture_compression_3dc があっても OpenGL ES 2.0 と違い
rgtc の方を使います。
つまり GL_3DC_XY ではなく GL_COMPRESSED_RED_GREEN_RGTC2_EXT 。
// GL_EXT_texture_compression_latc GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 // GL_EXT_texture_compression_rgtc GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
OpenGL ES 2.0 GPU の場合 Adreno (ATI系) が 3DC、Tegra2 が LATC に対応
しています。
利用可能なカラー圧縮、法線圧縮フォーマットをまとめると下記の通りです。
COLOR COLOR-EA COLOR-IA NORMAL NORMAL-S 1ch -------------------------------------------------------------- PowerVR PVRTC -- PVRTC-A -- -- -- Adreno ATC ATC-A ATC-I 3DC_XY -- 3DC_X Tegra DXT1 DXT3 DXT5 LATC2 LATC2-S LATC1 ZMS DXT1 DXT3 DXT5 (DXT5n) -- -- Mali ETC1 -- -- -- -- --
対応していない GPU は非圧縮 LA8 で代用しなければなりません。
圧縮に対応していても RG(3DC) と LA でシェーダーを完全に共有するのは
難しそうです。
関連エントリ
・Android OpenGL ES 2.0 の圧縮テクスチャ
2011/02/16
Android OpenGL ES 2.0 の圧縮テクスチャ
OpenGL ES 2.0 では使用可能な圧縮テクスチャ形式が GPU 毎に異なっています。
カラー向けのフォーマットは現在大きく分けて下記の 4 通りあります。
(1) PVRTC 系
(2) ATITC 系
(3) S3TC(DXT) 系
(4) ETC 系
●(1) PVRTC 系
PowerVR SGX 系各種。
iOS 系の全機種で使われているため対応ハードはかなり多いはずです。
Android の場合は Galaxy S/Tab の Samsung S5PC110 等。
フォーマットは下記の 4通り。
PVRTC は 2bpp/4bpp 選択可能で alpha チャンネルを含めることができるため
同一解像度なら他のフォーマットよりも少ない容量に変換されます。
反面、正方形しばりがあります。元画像が正方形でない場合は引き伸ばすことに
なるため逆に容量が大きくなるケースがあります。
2倍までのスケーリングなら 2bpp に落とすことでほぼ同等の画質と容量を維持
することができると思われます。
例
・元画像が 256x256 なら 4bpp に変換
・元画像が 128x256 なら 256x256 に拡大+ 2bpp に変換
変換ツールは開発者サイト PowerVR Insder にあります。
・Imagination PowerVR Insider
テクスチャは専用の pvr 形式で保存しますが、pvr 形式自体は ETC,DXT 等
さまざまなフォーマットを格納可能です。
●(2) ATITC 系
ATI の Imageon 及び、Qualcomm の Snapdragon 等に搭載されている Adreno
シリーズで対応しています。
Android に限定すると対応端末はかなり多いと思われます。
4bpp 時に 1bit alpha を含められない以外は圧縮率も機能共にほぼ
DXT1/DXT3/DXT5 と同等になっているようです。画質に関しては未調査。
圧縮ツールは AMD(ATI) 製のものがあります。
このツールは ATC や ETC を DDS 形式で保存します。
・AMD The Compressonator
Adreno と改名した後 Qualcomm も開発者向けページを用意しています。
・Adreno Graphics
ATITC 系 GPU は法線などカラー以外に応用可能な 3DC (BC4/5) も対応している
のが特徴です。
●(3) S3TC/DXT 系
NVIDIA Tegra2, 3DLabs ZMS-08 HD, PC 向け GPU 各種。
DirectX の標準フォーマットであり、OpenGL でも多くの PC 向け GPU が
対応しています。
とにかく対応しているツール数が多く、変換や扱いで困ることがありません。
DXT1 は 1bit の alpha 値を含めることが出来ますが、OpenGL の場合この
両者を区別しています。厳密には 4x4 pixel の block 単位で切り替えられる
ため DirectX では区別がありません。
DXT1/DXT3/DXT5 は Direct3D 10 以降 BC1/BC2/BC3 と呼ばれます。
●(4) ETC 系
Android の場合すべての GPU で利用できます。
ARM Mali など ETC のみ対応している GPU もあります。
iOS では PowerVR 一つなので問題ありませんが、Android では GPU 毎に
互換性のない様々な圧縮テクスチャ形式を持っています。
Android で唯一の共通フォーマットとして利用出来るのが ETC1 圧縮です。
Froyo 2.2 以降 ETC1 専用の API も用意されています。
iOS では使えませんが Android 上では PowerVR も ETC1 が使えます。
ETC1 の圧縮は比較的多くのツールで対応しています。
例えば ATITC で紹介した AMD The Compressonator も ETC 変換可能で DDS として
保存できます。
ただし ETC 圧縮時に画質(変換速度)を指定できず、プレビューで極端に劣化した
画像が表示されることがあります。PVR 用の PVRTexTool ツールで読み込ませると
正しく表示されるため、The Compressonator だと ETC 画像の読み込み部に
何らかの問題がありそうです。
Ericsson 本家及び Mali のツールがあります。
・Ericsson Texture Compression
・Mali Developer Center
●ファイルフォーマット
●DDS
DirectX 標準フォーマットです。mipmap, cubemap, volume, array など各種形式に
対応可能で、古くから使われているためツール類が揃っています。
特殊なフォーマットは FourCC で識別しているので、4文字のコードが決まれば
新しい圧縮形式でも対応できます。
・DDS Texture format memo
●PVR
PVRTC だけでなく DXT/ETC などさまざまな画像フォーマットに対応しているようです。
ATITC のファイルタイプは定義されていないので格納できません。
比較的ツールも揃っているようです。
●KTX
OpenGL / OpenGL ES 向けに新たに作られたフォーマットのようです。
PVRTexTool が対応しています。
GL のシンボル値をそのまま格納するので GL API と相性が良いのが特徴。
OpenGL で数値が定義されていれば、新しい圧縮形式でもそのまま保存する
ことが出来ます。
・Khronos KTX File Format Specification
画像格納時の優先順が DDS と逆で、3d/cube/array を持ったデータが mipmap 個
並ぶ順番になっています。
ツールでは画像の上下など GL の定義に厳密に変換される可能性があるようです。
メタデータ KTXorientation を調べることで uv の向きがわかります。
ヘッダが Bigendian/Littleendian 両対応しているなど、ターゲットハードに
最適化した実行時向けのフォーマットと思われます。
●PKM
ETC1 (PACKMAN) のための専用フォーマットのようです。
Android の ETC1 用 API が対応しています。
●Android とテクスチャ
効率を考えると GPU Native なフォーマットの方が有利ですが管理が大変です。
それでも速度最優先なら全部持つしかなさそうです。
1. alpha 不要なら ETC1
2. alpha が必要で速度優先なら PVRTC,ATITC,S3TC,非圧縮 全部
カラー向けのフォーマットは現在大きく分けて下記の 4 通りあります。
(1) PVRTC 系
(2) ATITC 系
(3) S3TC(DXT) 系
(4) ETC 系
iOS PowerVR SGX PVRTC Android Qualcomm Adreno ETC1, ATITC, 3DC, PALETTE ATI Imageon ETC1, ATITC, 3DC, PALETTE Imagination PowerVR ETC1, PVRTC NVIDIA Tegra2 ETC1, S3TC(DXT), LATC ZiiLabs ZMS-08 HD ETC1, S3TC(DXT), PALETTE
●(1) PVRTC 系
PowerVR SGX 系各種。
iOS 系の全機種で使われているため対応ハードはかなり多いはずです。
Android の場合は Galaxy S/Tab の Samsung S5PC110 等。
フォーマットは下記の 4通り。
PVRTC RGB 4bpp PVRTC RGBA 4bpp PVRTC RGB 2bpp PVRTC RGBA 2bpp
PVRTC は 2bpp/4bpp 選択可能で alpha チャンネルを含めることができるため
同一解像度なら他のフォーマットよりも少ない容量に変換されます。
反面、正方形しばりがあります。元画像が正方形でない場合は引き伸ばすことに
なるため逆に容量が大きくなるケースがあります。
2倍までのスケーリングなら 2bpp に落とすことでほぼ同等の画質と容量を維持
することができると思われます。
例
・元画像が 256x256 なら 4bpp に変換
・元画像が 128x256 なら 256x256 に拡大+ 2bpp に変換
変換ツールは開発者サイト PowerVR Insder にあります。
・Imagination PowerVR Insider
テクスチャは専用の pvr 形式で保存しますが、pvr 形式自体は ETC,DXT 等
さまざまなフォーマットを格納可能です。
●(2) ATITC 系
ATI の Imageon 及び、Qualcomm の Snapdragon 等に搭載されている Adreno
シリーズで対応しています。
Android に限定すると対応端末はかなり多いと思われます。
FourCC bpp ATITC RGB 'ATC ' 4bpp ATITC RGBA 'ATCA' 8bpp Explicit Alpha ATITC RGBA 'ATCI' 8bpp Interpolated Alpha
4bpp 時に 1bit alpha を含められない以外は圧縮率も機能共にほぼ
DXT1/DXT3/DXT5 と同等になっているようです。画質に関しては未調査。
圧縮ツールは AMD(ATI) 製のものがあります。
このツールは ATC や ETC を DDS 形式で保存します。
・AMD The Compressonator
Adreno と改名した後 Qualcomm も開発者向けページを用意しています。
・Adreno Graphics
ATITC 系 GPU は法線などカラー以外に応用可能な 3DC (BC4/5) も対応している
のが特徴です。
●(3) S3TC/DXT 系
NVIDIA Tegra2, 3DLabs ZMS-08 HD, PC 向け GPU 各種。
DirectX の標準フォーマットであり、OpenGL でも多くの PC 向け GPU が
対応しています。
とにかく対応しているツール数が多く、変換や扱いで困ることがありません。
FourCC bpp dx10 S3TC RGB 'DXT1' 4bpp BC1 S3TC RGBA 'DXT1' 4bpp BC1 (1bit alpha) S3TC RGBA 'DXT3' 8bpp BC2 S3TC RGBA 'DXT5' 8bpp BC3
DXT1 は 1bit の alpha 値を含めることが出来ますが、OpenGL の場合この
両者を区別しています。厳密には 4x4 pixel の block 単位で切り替えられる
ため DirectX では区別がありません。
DXT1/DXT3/DXT5 は Direct3D 10 以降 BC1/BC2/BC3 と呼ばれます。
●(4) ETC 系
Android の場合すべての GPU で利用できます。
ARM Mali など ETC のみ対応している GPU もあります。
iOS では PowerVR 一つなので問題ありませんが、Android では GPU 毎に
互換性のない様々な圧縮テクスチャ形式を持っています。
Android で唯一の共通フォーマットとして利用出来るのが ETC1 圧縮です。
Froyo 2.2 以降 ETC1 専用の API も用意されています。
iOS では使えませんが Android 上では PowerVR も ETC1 が使えます。
FourCC bpp ETC RGB 'ETC ' 4bpp
ETC1 の圧縮は比較的多くのツールで対応しています。
例えば ATITC で紹介した AMD The Compressonator も ETC 変換可能で DDS として
保存できます。
ただし ETC 圧縮時に画質(変換速度)を指定できず、プレビューで極端に劣化した
画像が表示されることがあります。PVR 用の PVRTexTool ツールで読み込ませると
正しく表示されるため、The Compressonator だと ETC 画像の読み込み部に
何らかの問題がありそうです。
Ericsson 本家及び Mali のツールがあります。
・Ericsson Texture Compression
・Mali Developer Center
●ファイルフォーマット
PVRTC ATITC S3TC ETC 拡張 ---------------------------------- DDS -- ◯ ◎ ◯ FourCC PVR ◎ -- ◯ ◯ KTX ◯ ◯ ◯ ◯ GL_* PKM -- -- -- ◎
●DDS
DirectX 標準フォーマットです。mipmap, cubemap, volume, array など各種形式に
対応可能で、古くから使われているためツール類が揃っています。
特殊なフォーマットは FourCC で識別しているので、4文字のコードが決まれば
新しい圧縮形式でも対応できます。
・DDS Texture format memo
●PVR
PVRTC だけでなく DXT/ETC などさまざまな画像フォーマットに対応しているようです。
ATITC のファイルタイプは定義されていないので格納できません。
比較的ツールも揃っているようです。
●KTX
OpenGL / OpenGL ES 向けに新たに作られたフォーマットのようです。
PVRTexTool が対応しています。
GL のシンボル値をそのまま格納するので GL API と相性が良いのが特徴。
OpenGL で数値が定義されていれば、新しい圧縮形式でもそのまま保存する
ことが出来ます。
・Khronos KTX File Format Specification
画像格納時の優先順が DDS と逆で、3d/cube/array を持ったデータが mipmap 個
並ぶ順番になっています。
ツールでは画像の上下など GL の定義に厳密に変換される可能性があるようです。
メタデータ KTXorientation を調べることで uv の向きがわかります。
ヘッダが Bigendian/Littleendian 両対応しているなど、ターゲットハードに
最適化した実行時向けのフォーマットと思われます。
●PKM
ETC1 (PACKMAN) のための専用フォーマットのようです。
Android の ETC1 用 API が対応しています。
●Android とテクスチャ
効率を考えると GPU Native なフォーマットの方が有利ですが管理が大変です。
それでも速度最優先なら全部持つしかなさそうです。
1. alpha 不要なら ETC1
2. alpha が必要で速度優先なら PVRTC,ATITC,S3TC,非圧縮 全部