エリクソンテクスチャ圧縮(ETC)は、2005年初頭にエリクソンリサーチと共同で開発された非可逆テクスチャ圧縮技術です。当初はiPACKMAN [ 1 ]という名前で開発され、 PACKMAN [ 2 ]と呼ばれる以前の圧縮方式に基づいています。
オリジナルの「ETC1」圧縮方式は、24ビットRGBデータの6倍圧縮を提供します。アルファ成分を含む画像の圧縮には対応していませんが、回避策はあります。[ 3 ]
ETC1 は 4x4ピクセルデータグループを受け取り、それぞれを 1 つの 64 ビット ワードに圧縮します。4×4 ピクセル グループを最初に水平方向または垂直方向に 2 つの 4×2 チャンクに分割します。各半分にベース カラーが割り当てられます。これは、4/4/4 RGB を使用するか、一方に 5/5/5 RGB を割り当て、もう一方にそのベース カラーから 3/3/3 ビット オフセットした値を割り当てることによって行います。各 4×2 領域には、3 ビットの輝度範囲の選択もあります。次に、各ピクセルは、4×4 グループの半分のベース カラーに 4 つの符号付き値のいずれかを加算することによって、ベース カラーからオフセットされます。
このフォーマットは、携帯電話などの組み込みデバイス向けのOpenGL ESグラフィックス標準拡張機能[ 4 ]の一部であり、ブラウザ側のワールドワイドウェブグラフィックス用のWebGLグラフィックス標準で使用するためにKhronos Groupによって承認されています。
「ETC2」方式は、ETC1を後方互換性のある方法で拡張し、より高品質のRGB圧縮[ 6 ]とRGBA(RGBプラスアルファ)の圧縮を提供します。
OpenGL ES 3.0 [ 7 ]および OpenGL 4.3 [ 8 ]では、以下の ETC2 コーデックが必須です。
GL_COMPRESSED_RGB8_ETC2— ETC1の後継であるRGB888データを圧縮します。GL_COMPRESSED_RGBA8_ETC2_EAC— RGBA8888データを完全なアルファサポートで圧縮します。GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2— ピクセルが完全に透明か完全に不透明かのいずれかであるRGBAデータを圧縮します。上記コーデックのsRGB版も利用可能です。
EACはETC1/ETC2と同じ原理に基づいて構築されていますが、1チャンネルまたは2チャンネルのデータに使用されます。OpenGL ES 3.0およびOpenGL 4.3では、以下の4つのEACコーデックが必須として含まれています。
GL_COMPRESSED_R11_EAC— 1チャネルの符号なしデータGL_COMPRESSED_SIGNED_R11_EAC— 1つのチャネルの署名付きデータGL_COMPRESSED_RG11_EAC— 2チャンネルの符号なしデータGL_COMPRESSED_SIGNED_RG11_EAC— 2チャネルの符号付きデータRGBAおよびRG11フォーマットは4x4ブロックあたり128ビットでエンコードされ、その他のフォーマットはブロックあたり64ビットでエンコードされます。RGBAの場合、RGBチャンネルは通常の64ビットブロックでエンコードされ、Aチャンネルは独自の64ビットブロックを持ちます。RG11フォーマットも同様に、コンポーネントごとに1つの64ビットブロックでエンコードされます。
ETC1/ETC2テクスチャの圧縮と解凍を行うETCPACKと呼ばれるソフトウェアユーティリティは、 EricssonのGitHubからコード形式で無料でダウンロードできます。[ 9 ]