日別アーカイブ: 2011年2月16日

Android OpenGL ES 2.0 の圧縮テクスチャ

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 にあります。

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 の場合この
両者を区別しています。厳密には 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文字のコードが決まれば
新しい圧縮形式でも対応できます。

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,非圧縮 全部