OpenGL ES 2.0 では使用可能な圧縮テクスチャ形式が GPU 毎に異なっています。
カラー向けのフォーマットは現在大きく分けて下記の 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 に落とすことでほぼ同等の画質と容量を維持
することができると思われます。
例
・元画像が 256×256 なら 4bpp に変換
・元画像が 128×256 なら 256×256 に拡大+ 2bpp に変換
変換ツールは開発者サイト PowerVR Insder にあります。
テクスチャは専用の 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 形式で保存します。
Adreno と改名した後 Qualcomm も開発者向けページを用意しています。
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 の場合この
両者を区別しています。厳密には 4×4 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文字のコードが決まれば
新しい圧縮形式でも対応できます。
●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,非圧縮 全部