文書の過去の版を表示しています。
目次
圧縮 Texture
圧縮テクスチャとは
GPU が直接アクセスできる画像フォーマットです。 DXT1, DXT3, DXT5 (S3TC) 形式が有名です。
例えば 256×256 pixel の画像を考えると、フルカラーの 32bit R8G8B8A8 フォーマットでは 256KB になります。 DXT5 では わずか 64KB、DXT1 で済むなら 32KB に圧縮できます。 PVRTC や ASTC では、さらに圧縮率が高い 2~0.9bpp の形式も定義されています。
format | bpp | 256×256 時の容量 |
---|---|---|
フルカラー 32bit R8G8B8A8 | 32bpp | 256KB |
ハイカラー 16bit R5G6B5 | 16bpp | 128KB |
S3TC DXT5 圧縮テクスチャ | 8bpp | 64kB |
S3TC DXT1 圧縮テクスチャ | 4bpp | 32KB |
データ容量の削減と、描画の高速化の双方に大きなメリットがあります。
- データ容量の削減が可能で ROM 容量やダウンロードパッケージサイズが小さくなる
- VRAM の消費メモリが小さくて済み、より多くのデータを読み込んでおくことができる
- GPU がアクセスするメモリ帯域が削減され、メモリアクセスのボトルネックが解消する
GPU が直接画像をアクセスし、展開もハードウエアが直接行うので速度が遅くなることはありません。 むしろ非圧縮形式よりも GPU ネイティブの圧縮テクスチャの方が高速です。 その理由はメモリ帯域の削減と、圧縮されている方がテクスチャのキャッシュを効率良く活用できるからです。
その代償は画質です。 Lossy (非可逆圧縮) であり、元データからは大きく画質が落ちます。 例えばキーカラー (EndPoint) は 565 ~ 444 等に制限されますし、ブロック単位に使える色数も階調も制限されます。 特に圧縮アルゴリズムの構造上、4×4 サイズのブロックノイズが出ることがあります。 565 など RGB 非対称の場合は補間により色ずれも発生します。
GPU Compressed Texture Formats
DirectX と OpenGL の対応、FourCC
Format | DirectX/FourCC | bpp | RGB | alpha | base | block | Pt | DP | DXGI (Windows) | OpenGL |
---|---|---|---|---|---|---|---|---|---|---|
S3TC/DXT1/BC1/S3TC-RGB | 'DXT1' | 4bpp | RGB | - | 565 | 4×4 | 1 | 1 | 71 DXGI_FORMAT_BC1_UNORM | 83F0 GL_COMPRESSED_RGB_S3TC_DXT1_EXT |
S3TC/DXT1/BC1/S3TC-RGBA | 'DXT1' | 4bpp | RGB | 1bit | 565 | 4×4 | 1 | 1 | 71 DXGI_FORMAT_BC1_UNORM | 83F1 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT |
S3TC/DXT3/BC2 | 'DXT3' | 8bpp | RGB | A | 565 +4 | 4×4 | 1 | 2 | 74 DXGI_FORMAT_BC2_UNORM | 83F2 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT |
S3TC/DXT5/BC3 | 'DXT5' | 8bpp | RGB | A | 565 +8 | 4×4 | 1 | 2 | 77 DXGI_FORMAT_BC3_UNORM | 83F3 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT |
S3TC/BC1-SRGB | 72 | 4bpp | SRGB | - | 565 | 4×4 | 1 | 1 | 72 DXGI_FORMAT_BC1_UNORM_SRGB | 8C4C GL_COMPRESSED_SRGB_S3TC_DXT1_EXT |
S3TC/BC1-SRGB | 72 | 4bpp | SRGB | 1bit | 565 | 4×4 | 1 | 1 | 72 DXGI_FORMAT_BC1_UNORM_SRGB | 8C4D GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT |
S3TC/BC2-SRGB | 75 | 8bpp | SRGB | A | 565 +4 | 4×4 | 1 | 2 | 75 DXGI_FORMAT_BC2_UNORM_SRGB | 8C4E GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT |
S3TC/BC3-SRGB | 78 | 8bpp | SRGB | A | 565 +8 | 4×4 | 1 | 2 | 78 DXGI_FORMAT_BC3_UNORM_SRGB | 8C4F GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT |
ATITC-RGB | 'ATC ' | 4bpp | RGB | - | 8C92 GL_ATC_RGB_AMD | |||||
ATTIC-EA | 'ATCA' | 8bpp | RGB | A | 8C93 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD | |||||
ATTIC-IA | 'ATCI' | 8bpp | RGB | A | 87EE GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD | |||||
ETC1 | 'ETC ' | 4bpp | RGB | - | 555+333/444 | 4x2x2 | 2 | 1 | 8D64 GL_ETC1_RGB8_OES | |
ETC2 | 4bpp | RGB | - | 5 mode | 4×4 | 2 | 1 | 9274 GL_COMPRESSED_RGB_ETC2 | ||
ETC2-SRGB | 4bpp | SRGB | - | 5 mode | 4×4 | 2 | 1 | 9275 GL_COMPRESSED_SRGB8_ETC2 | ||
ETC2 A1bit | 4bpp | RGB | 1bit | 4 mode | 4×4 | 2 | 1 | 9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | ||
ETC2-SRGB A1bit | 4bpp | SRGB | 1bit | 4 mode | 4×4 | 2 | 1 | 9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | ||
ETC2 + EAC | 8bpp | RGB | A | 5 mode | 4×4 | 2 | 2 | 9278 GL_COMPRESSED_RGBA8_ETC2_EAC | ||
ETC2-SRGB + EAC | 8bpp | SRGB | A | 5 mode | 4×4 | 2 | 2 | 9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC | ||
EAC R11 UNSIGNED | 4bpp | R | - | 4×4 | 1 | 1 | 9270 GL_COMPRESSED_R11_EAC | |||
EAC R11 SIGNED | 4bpp | R | - | 4×4 | 1 | 1 | 9271 GL_COMPRESSED_SIGNED_R11_EAC | |||
EAC RG11 UNSIGNED | 8bpp | RG | - | 4×4 | 1 | 2 | 9272 GL_COMPRESSED_RG11_EAC | |||
EAC RG11 SIGNED | 8bpp | RG | - | 4×4 | 1 | 2 | 9273 GL_COMPRESSED_SIGNED_RG11_EAC | |||
RGTC/3DC-X/BC4 U | 'ATI1'/'BC4U'/80 | 4bpp | R | - | 8 | 4×4 | 1 | 1 | 80 DXGI_FORMAT_BC4_UNORM | 87F9 GL_3DC_X_AMD / 8DBB GL_COMPRESSED_RED_RGTC1_EXT |
RGTC/3DC-X/BC4 S | 'BC4S'/81 | 4bpp | R | - | 8 | 4×4 | 1 | 1 | 81 DXGI_FORMAT_BC4_SNORM | 8DBC GL_COMPRESSED_SIGNED_RED_RGTC1_EXT |
RGTC/3DC-XY/BC5 U | 'ATI2'/'BC5U'/83 | 8bpp | RG | - | 88 | 4×4 | 1 | 2 | 83 DXGI_FORMAT_BC5_UNORM | 87FA GL_3DC_XY_AMD / 8DBD GL_COMPRESSED_RED_GREEN_RGTC2_EXT |
RGTC/3DC-XY/BC5 S | 'BC5S'/84 | 8bpp | RG | - | 88 | 4×4 | 1 | 2 | 84 DXGI_FORMAT_BC5_SNORM | 8DBE GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT |
LATC L UNSIGNED | 4bpp | R | - | 8 | 4×4 | 1 | 1 | 8C70 GL_COMPRESSED_LUMINANCE_LATC1_EXT | ||
LATC L SIGNED | 4bpp | R | - | 8 | 4×4 | 1 | 1 | 8C71 GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT | ||
LATC LA UNSIGNED | 8bpp | R | A | 88 | 4×4 | 1 | 2 | 8C72 GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT | ||
LATC LA SIGNED | 8bpp | R | A | 88 | 4×4 | 1 | 2 | 8C73 GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT | ||
PVRTC RGBA 4bpp | 4bpp | RGB | A | 4443/4433 | 4×4 | 1 | 1 | 8C02 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG | ||
PVRTC RGB 4bpp | 4bpp | RGB | - | 555/554 | 4×4 | 1 | 1 | 8C00 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG | ||
PVRTC RGBA 2bpp | 2bpp | RGB | A | 4443/4433 | 4×8 | 1 | 1 | 8C03 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG | ||
PVRTC RGB 2bpp | 2bpp | RGB | - | 555/554 | 4×8 | 1 | 1 | 8C01 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG | ||
PVRTC2 RGBx 4bpp | 4bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×4 | 1 | 1 | 9138 | ||
PVRTC2 RGBx 2bpp | 2bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×8 | 1 | 1 | 9137 | ||
BPTC/BC6H-UF16 | 95 | 8bpp | RGB | - | 14 mode | 4×4 | 1-2 | 1 | 95 DXGI_FORMAT_BC6H_UF16 | 8E8F GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB |
BPTC/BC6H-SF16 | 96 | 8bpp | RGB | - | 14 mode | 4×4 | 1-2 | 1 | 96 DXGI_FORMAT_BC6H_SF16 | 8E8E GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB |
BPTC/BC7 | 98 | 8bpp | RGB | (A) | 8 mode | 4×4 | 1-3 | 1-2 | 98 DXGI_FORMAT_BC7_UNORM | 8E8C GL_COMPRESSED_RGBA_BPTC_UNORM_ARB |
BPTC/BC7-SRGB | 99 | 8bpp | SRGB | (A) | 8 mode | 4×4 | 1-3 | 1-2 | 99 DXGI_FORMAT_BC7_UNORM_SRGB | 8E8D GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB |
ASTC LDR 4×4 RGBA | 8bpp | RGB | (A) | 4×4 | 1-4 | 1-2 | 93B0 GL_COMPRESSED_RGBA_ASTC_4x4_KHR | |||
ASTC LDR 4×4 SRGB | 8bpp | SRGB | (A) | 4×4 | 1-4 | 1-2 | 93D0 GL_COMPRESSED_SRGB_ALPHA8_ASTC_4x4_KHR | |||
ASTC LDR 5×4 RGBA | 6.4bpp | RGB | (A) | 5×4 | 1-4 | 1-2 | 93B1 GL_COMPRESSED_RGBA_ASTC_5x4_KHR | |||
ASTC LDR 5×4 SRGB | 6.4bpp | SRGB | (A) | 5×4 | 1-4 | 1-2 | 93D1 GL_COMPRESSED_SRGB_ALPHA8_ASTC_5x4_KHR | |||
ASTC LDR 5×5 RGBA | 5.1bpp | RGB | (A) | 5×5 | 1-4 | 1-2 | 93B2 GL_COMPRESSED_RGBA_ASTC_5x5_KHR | |||
ASTC LDR 5×5 SRGB | 5.1bpp | SRGB | (A) | 5×5 | 1-4 | 1-2 | 93D2 GL_COMPRESSED_SRGB_ALPHA8_ASTC_5x5_KHR | |||
ASTC LDR 6×5 RGBA | 4.3bpp | RGB | (A) | 6×5 | 1-4 | 1-2 | 93B3 GL_COMPRESSED_RGBA_ASTC_6x5_KHR | |||
ASTC LDR 6×5 SRGB | 4.3bpp | SRGB | (A) | 6×5 | 1-4 | 1-2 | 93D3 GL_COMPRESSED_SRGB_ALPHA8_ASTC_6x5_KHR | |||
ASTC LDR 6×6 RGBA | 3.6bpp | RGB | (A) | 6×6 | 1-4 | 1-2 | 93B4 GL_COMPRESSED_RGBA_ASTC_6x6_KHR | |||
ASTC LDR 6×6 SRGB | 3.6bpp | SRGB | (A) | 6×6 | 1-4 | 1-2 | 93D4 GL_COMPRESSED_SRGB_ALPHA8_ASTC_6x6_KHR | |||
ASTC LDR 8×5 RGBA | 3.2bpp | RGB | (A) | 8×5 | 1-4 | 1-2 | 93B5 GL_COMPRESSED_RGBA_ASTC_8x5_KHR | |||
ASTC LDR 8×5 SRGB | 3.2bpp | SRGB | (A) | 8×5 | 1-4 | 1-2 | 93D5 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x5_KHR | |||
ASTC LDR 8×6 RGBA | 2.7bpp | RGB | (A) | 8×6 | 1-4 | 1-2 | 93B6 GL_COMPRESSED_RGBA_ASTC_8x6_KHR | |||
ASTC LDR 8×6 SRGB | 2.7bpp | SRGB | (A) | 8×6 | 1-4 | 1-2 | 93D6 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x6_KHR | |||
ASTC LDR 8×8 RGBA | 2.0bpp | RGB | (A) | 8×8 | 1-4 | 1-2 | 93B7 GL_COMPRESSED_RGBA_ASTC_8x8_KHR | |||
ASTC LDR 8×8 SRGB | 2.0bpp | SRGB | (A) | 8×8 | 1-4 | 1-2 | 93D7 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x8_KHR | |||
ASTC LDR 10×5 RGBA | 2.6bpp | RGB | (A) | 10×5 | 1-4 | 1-2 | 93B8 GL_COMPRESSED_RGBA_ASTC_10x5_KHR | |||
ASTC LDR 10×5 SRGB | 2.6bpp | SRGB | (A) | 10×5 | 1-4 | 1-2 | 93D8 GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x5_KHR | |||
ASTC LDR 10×6 RGBA | 2.1bpp | RGB | (A) | 10×6 | 1-4 | 1-2 | 93B9 GL_COMPRESSED_RGBA_ASTC_10x6_KHR | |||
ASTC LDR 10×6 SRGB | 2.1bpp | SRGB | (A) | 10×6 | 1-4 | 1-2 | 93D9 GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x6_KHR | |||
ASTC LDR 10×8 RGBA | 1.6bpp | RGB | (A) | 10×8 | 1-4 | 1-2 | 93BA GL_COMPRESSED_RGBA_ASTC_10x8_KHR | |||
ASTC LDR 10×8 SRGB | 1.6bpp | SRGB | (A) | 10×8 | 1-4 | 1-2 | 93DA GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x8_KHR | |||
ASTC LDR 10×10 RGBA | 1.3bpp | RGB | (A) | 10×10 | 1-4 | 1-2 | 93BB GL_COMPRESSED_RGBA_ASTC_10x10_KHR | |||
ASTC LDR 10×10 SRGB | 1.3bpp | SRGB | (A) | 10×10 | 1-4 | 1-2 | 93DB GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x10_KHR | |||
ASTC LDR 12×10 RGBA | 1.1bpp | RGB | (A) | 12×10 | 1-4 | 1-2 | 93BC GL_COMPRESSED_RGBA_ASTC_12x10_KHR | |||
ASTC LDR 12×10 SRGB | 1.1bpp | SRGB | (A) | 12×10 | 1-4 | 1-2 | 93DC GL_COMPRESSED_SRGB_ALPHA8_ASTC_12x10_KHR | |||
ASTC LDR 12×12 RGBA | 0.9bpp | RGB | (A) | 12×12 | 1-4 | 1-2 | 93BD GL_COMPRESSED_RGBA_ASTC_12x12_KHR | |||
ASTC_LDR 12×12 SRGB | 0.9bpp | SRGB | (A) | 12×12 | 1-4 | 1-2 | 93DD GL_COMPRESSED_SRGB_ALPHA8_ASTC_12x12_KHR |
- Pt = Partition
- DI = Dual Plane
フォーマット対応表
format | DXT (DX9) | BC (DX10/11) | ATITC(ATC) + 3DC | PVRTC (PVRTC2) | ETC1 | ETC2 + EAC | BPTC | ASTC | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RGB | DXT1 | 4bpp | BC1 | 4bpp | ATC-RGB | 4bpp | PVRTC4/2 | 4/2bpp | ETC1 | 4bpp | ETC2 | 4bpp | ||||
RGB + A 1bit | DXT1 | 4bpp | BC1 | 4bpp | ETC2 | 4bpp | ||||||||||
RGBA (EA) | DXT3 | 8bpp | BC2 | 8bpp | ATC-EA | 8bpp | ||||||||||
RGBA (IA) | DXT5 | 8bpp | BC3 | 8bpp | ATC-IA | 8bpp | PVRTC4/2 | 4/2bpp | ETC2+EAC | 8bpp | ||||||
R | BC4 | 4bpp | 3DC-X | 4bpp | EAC | 4bpp | ||||||||||
RG | BC5 | 8bpp | 3DC-XY | 8bpp | EAC | 8bpp | ||||||||||
HDR RGB | BC6H | 8bpp | BPTC | 8bpp | ASTC HDR | |||||||||||
New RGBA | BC7 | 8bpp | BPTC | 8bpp | ASTC LDR | 0.9~8bpp |
GPU Native Formats
OpenGL ES 2.0 GPU では今のところ完全に共通で使える圧縮テクスチャフォーマットがありません。 各メーカーバラバラの対応となっています。
GPU | OS | API | DXT,S3TC | RGTC | LATC | BPTC | PVRTC | ATITC | ETC1 | ETC2/EAC | |
---|---|---|---|---|---|---|---|---|---|---|---|
DXT1,BC1 | DXT3/5,BC2/3 | 3DC,BC4/5 | BC6H/7 | ||||||||
PowerVR SGX535 iOS | iOS 4.2 | OpenGL ES 2.0 | × | × | × | × | × | ◎ | × | × | ✕ |
PowerVR G6430 iOS | iOS 7.0 | OpenGL ES 2.0 | ✕ | ✕ | ✕ | ✕ | ✕ | ◎ | ✕ | ✕ | ✕ |
PowerVR G6430 iOS | iOS 7.0 | OpenGL ES 3.0 | ✕ | ✕ | ✕ | ✕ | ✕ | ◎ | ✕ | ◎ | ◎ |
PowerVR SGX540 Android | Android 2.2 | OpenGL ES 2.0 | × | × | × | × | × | ◎ | × | ◎ | ✕ |
Adreno 200 / AMD Z430 | Android 2.2 | OpenGL ES 2.0 | × | × | ◎ | × | × | × | ◎ | ◎ | ✕ |
Adreno 220 | Android 2.3 | OpenGL ES 2.0 | × | × | ◎ | × | × | × | ◎ | ◎ | ✕ |
Adreno 320 | Android 4.3 | OpenGL ES 3.0 | × | × | ◎ | × | × | × | ◎ | ◎ | ◎ |
ULP GeForce (Tegra 250) | Android 2.2 | OpenGL ES 2.0 | ◎ | ◎ | × | ◎ | × | × | × | ◎ | ✕ |
ZMS-08 HD | Android 2.1 | OpenGL ES 2.0 | ◎ | ◎ | × | × | × | × | × | ◎ | ✕ |
Mali-400MP | Android 2.3 | OpenGL ES 2.0 | × | × | × | × | × | × | × | ◎ | ✕ |
Mali-T604 | Android 4.2 | OpenGL ES 2.0 | × | × | × | × | × | × | × | ◎ | ✕ |
Mali-T604 | Android 4.3 | OpenGL ES 3.0 | × | × | × | × | × | × | × | ◎ | ◎ |
FIMG-3DSE | ◎ | ? | × | × | × | × | × | ? | ✕ | ||
GPU | OS | API | DXT,S3TC | RGTC | LATC | BPTC | PVRTC | ATITC | ETC1 | ETC2/EAC | |
DXT1,BC1 | DXT3/5,BC2/3 | 3DC,BC4/5 | BC6H/7 | ||||||||
GeForce GT 240 | Windows 7 | OpenGL | ◎ | ◎ | ◎ | ◎ | × | × | × | × | |
RADEON HD 5850 | Windows 7 | OpenGL 4.1 | ◎ | ◎ | ◎ | ◎ | ◎ | × | × | × | |
GeForce GT 330M | Windows 7 | OpenGL 3.1 | ◎ | ◎ | ◎ | ◎ | × | × | × | × | |
GeForce GTX 460 | Windows 7 | OpenGL 4.1 | ◎ | ◎ | ◎ | ◎ | ◎ | × | × | × | |
GMA HD | Windows 7 | OpenGL 2.1 | ◎ | ◎ | × | × | × | × | × | × |
- Android 向け GPU では ETC1 が唯一の共通フォーマットとなります。
- Android OS 2.2 (Froyo) では Java に ETC1 の API も追加されています。
- iOS では PVRTC が共通フォーマットになります。
- ETC2 は ETC1 の上位互換性を保っているので、ETC2 対応 GPU は ETC1 も使用できます。
GPU 毎の用途別圧縮フォーマット
GPU | RGB | RGB+ A1bit | RGB+A(E) | RGB+A(I) | Normal | Alpha |
---|---|---|---|---|---|---|
PVR SGX | PVRTC 2/4bpp | PVRTC 2/4bpp | ||||
Adreno | ATC RGB / ETC1 | ATC-A | ATC-I | 3DC-XY | 3DC-X | |
Tegra | DXT1 | DXT1 | DXT3 | DXT5 |
Format 資料
- BC1/BC2/BC3/BC4/BC5/DXT1/DXT3/DXT5
圧縮テクスチャの解説
Partition 分割
block 単位に代表色 (end point) とその補間値を持つ方法では急激な色の変化を表現することが苦手です。 それを克服するための方法の一つがパーティション分割です。
block をエリアに分けて、それぞれのエリアごとに代表色 ( end point ) と補間値のセットを持つことができます。
分割方法はプリセットで組み込まれており、64種類、4096種類などアルゴリズムによって異なります。 この中から画像に合わせて最適な分割パターンを選びます。
分割パターン数は限られていること、 カラー値 (endpoint) のセットを複数用意しなければならないため、その他の情報が削られる傾向にあるなど それなりにトレードオフが発生します。 またパーティション数が増えるほど圧縮時間がかかります。
- partition = 複数の endpoint セットを持つこと
- dual plane = 複数の index セットを持つこと
Dual Plane (複数 Index set)
カラー値とアルファ値、ノーマルマップの X 値と Y 値など、データによっては関連性のない、独立性の高い値が含まれていることがあります。
単一の index では限界があるので、複数の index set を持つことができます。 代表的な用途はこの 2種類です。
- カラー値とアルファ値の分離を高める
- ノーマルマップ圧縮の精度を高める
例えば DXT5 では、カラー用に endpoint を 565 で 2個、アルファ用に 8bit を 2個含んでいます。
DXT5 Color 64bit endopint0 = RGB565 = 16bit endpoint1 = RGB565 = 16bit index = 2bit x 16 = 32bit Alpha 64bit endpoint0 = Alpha8 = 8bit endpoint1 = Alpha8 = 8bit index = 3bit x 16 = 48bit
Color と Alpha がそれぞれ個別に index を持っています。 このようなデータ形式が Dual Plane です。
ノーマルマップ向けと言われている 3Dc-XY (RGTC2), LATC2, EAC_RG, BPTC, ASTC はこのような Dual Plane 機能を持っています。
endpoint
パレットテクスチャ
パレットテクスチャ (Color Look Up Table) は圧縮テクスチャの一種です。 S3TC (DXT) 等のブロック圧縮アルゴリズムが普及する前は、最も多く使われている形式でした。
この方法では画素情報の他に、テクスチャ単位でカラーテーブルが必要となります。
GPU のテクスチャサンプリングは瞬間的に非常に狭い範囲のピクセルに集中しますが、 パレットでは画像全体のグローバルな情報である巨大なカラーテーブルを予めロードしておく必要がありました。 カラーテーブルはアクセスが集中するため、GPU のテクスチャサンプリングでのボトルネックになります。
またプログラマは画像とカラーテーブルの 2つのデータを同時に管理する必要が生じます。
ブロック圧縮テクスチャでは、GPU が必要とする対象の画素情報 64bit だけで必要な色を求めることができます。 64bit だけで周囲 4×4 エリアのキャッシュにもなりますし、 テクスチャユニットは周囲 4 pixel 単位でアクセスするため効率的です。
ブロックが独立しているため画像全体で使用出来る色数が制限されません。 複数の画像を 1枚のテクスチャにシート化しても、ブロックが異なれば全く影響を受けないことになります。(ただし mipmap 時は要注意) 圧縮率も 4bpp でほぼ 16色パレット相当の容量で済みますし、テーブルの分だけ小さくなります。 このように GPU にとって大変都合が良かったのです。
パレットテクスチャは GPU からみてさまざまな面で不利だったので、 ブロック圧縮テクスチャが広まってからはほぼレガシー扱いとなっています。 徐々に扱いが小さくなり、現在の GPU はパレット形式をネイティブでサポートしていません。
そのため古いゲームで多用されたパレットによる色変えやカラーアニメーションは、今の GPU では決して低コストではなくなりました。 シェーダーを使えばパレットテクスチャ相当を再現することができますが、速度的にも劣るし手間がかかるし あまりメリットはありません。
なお S3TC よりも前に、Dreamcast で使われた PowerVR2 では VQ 圧縮テクスチャが登場しています。 パレットと同じように狭いエリアで図形データを辞書として持ち、index 参照を行います。 パレットとブロック圧縮の中間の構造でした。