目次
圧縮 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 | 4bpp | SRGB | - | 565 | 4×4 | 1 | 1 | 72 DXGI_FORMAT_BC1_UNORM_SRGB | 8C4C GL_COMPRESSED_SRGB_S3TC_DXT1_EXT | |
S3TC/BC1-SRGB | 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 | 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 | 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 '/'ETC1' | 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'/'3DC1' | 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' | 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'/'3DC2' | 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' | 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 | 'PTC4' | 4bpp | RGB | A | 4443/4433 | 4×4 | 1 | 1 | 8C02 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG | |
PVRTC RGB 4bpp | 'PTC4' | 4bpp | RGB | - | 555/554 | 4×4 | 1 | 1 | 8C00 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG | |
PVRTC RGBA 2bpp | 'PTC2' | 2bpp | RGB | A | 4443/4433 | 4×8 | 1 | 1 | 8C03 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG | |
PVRTC RGB 2bpp | 'PTC2' | 2bpp | RGB | - | 555/554 | 4×8 | 1 | 1 | 8C01 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG | |
PVRTC SRGB 4bpp | 4bpp | RGB | - | 555/554 | 4×4 | 1 | 1 | 8A55 GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT | ||
PVRTC SRGB 2bpp | 2bpp | RGB | - | 555/554 | 4×8 | 1 | 1 | 8A54 GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT | ||
PVRTC2 RGBx 4bpp | 4bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×4 | 1 | 1 | 9137 GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG | ||
PVRTC2 RGBx 2bpp | 2bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×8 | 1 | 1 | 9138 GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG | ||
PVRTC2 SRGB 4bpp | 4bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×4 | 1 | 1 | 8A57 GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT | ||
PVRTC2 SRGB 2bpp | 2bpp | RGB | (A) | 555/554/4443/4433, 4 mode | 4×2 | 1 | 1 | 8A56 GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT | ||
BPTC/BC6H-UF16 | 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 | 8bpp | RGB | - | 14 mode | 4×4 | 1-2 | 1 | 96 DXGI_FORMAT_BC6H_SF16 | 8E8E GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB | |
BPTC/BC7 | 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 | 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 | 134 DXGI_FORMAT_ASTC_4X4_UNORM | 93B0 GL_COMPRESSED_RGBA_ASTC_4x4_KHR | ||
ASTC LDR 4×4 SRGB | 8bpp | SRGB | (A) | 4×4 | 1-4 | 1-2 | 135 DXGI_FORMAT_ASTC_4X4_UNORM_SRGB | 93D0 GL_COMPRESSED_SRGB_ALPHA8_ASTC_4x4_KHR | ||
ASTC LDR 5×4 RGBA | 6.4bpp | RGB | (A) | 5×4 | 1-4 | 1-2 | 138 DXGI_FORMAT_ASTC_5X4_UNORM | 93B1 GL_COMPRESSED_RGBA_ASTC_5x4_KHR | ||
ASTC LDR 5×4 SRGB | 6.4bpp | SRGB | (A) | 5×4 | 1-4 | 1-2 | 139 DXGI_FORMAT_ASTC_5X4_UNORM_SRGB | 93D1 GL_COMPRESSED_SRGB_ALPHA8_ASTC_5x4_KHR | ||
ASTC LDR 5×5 RGBA | 5.1bpp | RGB | (A) | 5×5 | 1-4 | 1-2 | 142 DXGI_FORMAT_ASTC_5X5_UNORM | 93B2 GL_COMPRESSED_RGBA_ASTC_5x5_KHR | ||
ASTC LDR 5×5 SRGB | 5.1bpp | SRGB | (A) | 5×5 | 1-4 | 1-2 | 143 DXGI_FORMAT_ASTC_5X5_UNORM_SRGB | 93D2 GL_COMPRESSED_SRGB_ALPHA8_ASTC_5x5_KHR | ||
ASTC LDR 6×5 RGBA | 4.3bpp | RGB | (A) | 6×5 | 1-4 | 1-2 | 146 DXGI_FORMAT_ASTC_6X5_UNORM | 93B3 GL_COMPRESSED_RGBA_ASTC_6x5_KHR | ||
ASTC LDR 6×5 SRGB | 4.3bpp | SRGB | (A) | 6×5 | 1-4 | 1-2 | 147 DXGI_FORMAT_ASTC_6X5_UNORM_SRGB | 93D3 GL_COMPRESSED_SRGB_ALPHA8_ASTC_6x5_KHR | ||
ASTC LDR 6×6 RGBA | 3.6bpp | RGB | (A) | 6×6 | 1-4 | 1-2 | 150 DXGI_FORMAT_ASTC_6X6_UNORM | 93B4 GL_COMPRESSED_RGBA_ASTC_6x6_KHR | ||
ASTC LDR 6×6 SRGB | 3.6bpp | SRGB | (A) | 6×6 | 1-4 | 1-2 | 151 DXGI_FORMAT_ASTC_6X6_UNORM_SRGB | 93D4 GL_COMPRESSED_SRGB_ALPHA8_ASTC_6x6_KHR | ||
ASTC LDR 8×5 RGBA | 3.2bpp | RGB | (A) | 8×5 | 1-4 | 1-2 | 154 DXGI_FORMAT_ASTC_8X5_UNORM | 93B5 GL_COMPRESSED_RGBA_ASTC_8x5_KHR | ||
ASTC LDR 8×5 SRGB | 3.2bpp | SRGB | (A) | 8×5 | 1-4 | 1-2 | 155 DXGI_FORMAT_ASTC_8X5_UNORM_SRGB | 93D5 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x5_KHR | ||
ASTC LDR 8×6 RGBA | 2.7bpp | RGB | (A) | 8×6 | 1-4 | 1-2 | 158 DXGI_FORMAT_ASTC_8X6_UNORM | 93B6 GL_COMPRESSED_RGBA_ASTC_8x6_KHR | ||
ASTC LDR 8×6 SRGB | 2.7bpp | SRGB | (A) | 8×6 | 1-4 | 1-2 | 159 DXGI_FORMAT_ASTC_8X6_UNORM_SRGB | 93D6 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x6_KHR | ||
ASTC LDR 8×8 RGBA | 2.0bpp | RGB | (A) | 8×8 | 1-4 | 1-2 | 162 DXGI_FORMAT_ASTC_8X8_UNORM | 93B7 GL_COMPRESSED_RGBA_ASTC_8x8_KHR | ||
ASTC LDR 8×8 SRGB | 2.0bpp | SRGB | (A) | 8×8 | 1-4 | 1-2 | 163 DXGI_FORMAT_ASTC_8X8_UNORM_SRGB | 93D7 GL_COMPRESSED_SRGB_ALPHA8_ASTC_8x8_KHR | ||
ASTC LDR 10×5 RGBA | 2.6bpp | RGB | (A) | 10×5 | 1-4 | 1-2 | 166 DXGI_FORMAT_ASTC_10X5_UNORM | 93B8 GL_COMPRESSED_RGBA_ASTC_10x5_KHR | ||
ASTC LDR 10×5 SRGB | 2.6bpp | SRGB | (A) | 10×5 | 1-4 | 1-2 | 167 DXGI_FORMAT_ASTC_10X5_UNORM_SRGB | 93D8 GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x5_KHR | ||
ASTC LDR 10×6 RGBA | 2.1bpp | RGB | (A) | 10×6 | 1-4 | 1-2 | 170 DXGI_FORMAT_ASTC_10X6_UNORM | 93B9 GL_COMPRESSED_RGBA_ASTC_10x6_KHR | ||
ASTC LDR 10×6 SRGB | 2.1bpp | SRGB | (A) | 10×6 | 1-4 | 1-2 | 171 DXGI_FORMAT_ASTC_10X6_UNORM_SRGB | 93D9 GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x6_KHR | ||
ASTC LDR 10×8 RGBA | 1.6bpp | RGB | (A) | 10×8 | 1-4 | 1-2 | 174 DXGI_FORMAT_ASTC_10X8_UNORM | 93BA GL_COMPRESSED_RGBA_ASTC_10x8_KHR | ||
ASTC LDR 10×8 SRGB | 1.6bpp | SRGB | (A) | 10×8 | 1-4 | 1-2 | 175 DXGI_FORMAT_ASTC_10X8_UNORM_SRGB | 93DA GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x8_KHR | ||
ASTC LDR 10×10 RGBA | 1.3bpp | RGB | (A) | 10×10 | 1-4 | 1-2 | 178 DXGI_FORMAT_ASTC_10X10_UNORM | 93BB GL_COMPRESSED_RGBA_ASTC_10x10_KHR | ||
ASTC LDR 10×10 SRGB | 1.3bpp | SRGB | (A) | 10×10 | 1-4 | 1-2 | 179 DXGI_FORMAT_ASTC_10X10_UNORM_SRGB | 93DB GL_COMPRESSED_SRGB_ALPHA8_ASTC_10x10_KHR | ||
ASTC LDR 12×10 RGBA | 1.1bpp | RGB | (A) | 12×10 | 1-4 | 1-2 | 182 DXGI_FORMAT_ASTC_12X10_UNORM | 93BC GL_COMPRESSED_RGBA_ASTC_12x10_KHR | ||
ASTC LDR 12×10 SRGB | 1.1bpp | SRGB | (A) | 12×10 | 1-4 | 1-2 | 183 DXGI_FORMAT_ASTC_12X10_UNORM_SRGB | 93DC GL_COMPRESSED_SRGB_ALPHA8_ASTC_12x10_KHR | ||
ASTC LDR 12×12 RGBA | 0.9bpp | RGB | (A) | 12×12 | 1-4 | 1-2 | 186 DXGI_FORMAT_ASTC_12X12_UNORM | 93BD GL_COMPRESSED_RGBA_ASTC_12x12_KHR | ||
ASTC_LDR 12×12 SRGB | 0.9bpp | SRGB | (A) | 12×12 | 1-4 | 1-2 | 187 DXGI_FORMAT_ASTC_12X12_UNORM_SRGB | 93DD GL_COMPRESSED_SRGB_ALPHA8_ASTC_12x12_KHR |
- Pt = Partition
- DI = Dual Plane
- FourCC : 'ATC ', 'ATCA', 'ATCI', 'ETC1', '3DC1', '3DC2' は Adreno SDK の Document に記載。'PTC2', 'PTC4' は PVRTexTool が生成する
- FourCC についてはこちら DDS フォーマットの詳細解説
フォーマット対応表
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-R11 | 4bpp | ||||||||||
RG | BC5 | 8bpp | 3DC-XY | 8bpp | EAC-RG11 | 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 では今のところ完全に共通で使える圧縮テクスチャフォーマットがありません。 各メーカーバラバラの対応となっています。
OpenGL ES 3.0 以降は iOS/Android 共に ETC2/EAC が共通で使える圧縮フォーマットになっています。
GPU | OS | API | DXT,S3TC | RGTC | LATC | BPTC | PVRTC | ATITC | ETC1 | ETC2/EAC | ASTC | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
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(8) Tegra 250 | Android 2.2 | OpenGL ES 2.0 | ◎ | ◎ | - | ◎ | - | - | - | ◎ | - | |
ULP GeForce(72) Tegra 4 | Android 4.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 | - | - | - | - | - | - | - | ◎ | ◎ | |
Vivante GC4000 (K3V2) | Android 4.1 | OpenGL ES 2.0 | ◎ | ◎ | - | - | - | - | - | ◎ | - | |
FIMG-3DSE | ◎ | ? | - | - | - | - | - | ? | - | |||
GPU | OS | API | DXT,S3TC | RGTC | LATC | BPTC | PVRTC | ATITC | ETC1 | ETC2/EAC | ASTC | |
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 | ◎ | ◎ | ◎ | ◎ | ◎ | - | - | - | ||
GeForce GTX 650 | Windows 7 | OpenGL 4.4 | ◎ | ◎ | ◎ | ◎ | ◎ | - | - | ◎ | ◎ | |
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 も使用できます。
- OpenGL ES 3.0 以上では iOS/Android どちらでも ETC2/EAC を利用することができます。
GPU 毎の用途別圧縮フォーマット
GPU | RGB | RGB+ A1bit | RGB+A(E) | RGB+A(I) | Normal (2ch) | Alpha (1ch) |
---|---|---|---|---|---|---|
PowerVR SGX Series 5(XT) | PVRTC 2/4bpp | – | PVRTC 2/4bpp | – | – | |
PowerVR Series 6 (Rogue) | PVRTC 2/4bpp | ETC2 | ETC2 + EAC | EAC-RG11 | EAC-R11 | |
Adreno OpenGL ES 2.0 | ATC RGB / ETC1 | – | ATC-A | ATC-I | 3DC-XY | 3DC-X |
Adreno OpenGL ES 3.0 | ATC RGB / ETC2 | ETC2 | ATC / ETC2 + EAC | 3DC-XY / EAC-RG11 | 3DC-X / EAC-R11 | |
ULP GeForce Tegra2/3/4 | DXT1 | DXT1 | DXT3 | DXT5 | LATC2 | LATC1 |
Mali-400MP | ETC1 | – | – | – | – | |
Mali-T604 | ETC2 | ETC2 | ETC2 + EAC | EAC-RG11 | EAC-R11 | |
Vivante GC4000 K3V2 | DXT1 | DXT1 | DXT3 | DXT5 | – (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
ブロック単位で格納される代表色です。 他の色は、この endpoint を元に生成が行われます。
DXT など多くのフォーマットは 2色の endpoint を持ちます。 Partition 分割をサポートしているフォーマットでは、endpoint セットの数が多くなります。
また特殊な例として、ETC2 では制限付きで 3色の endpoint 補間モードを持っています。 その代わりこの mode には index がありません。
endpoint は 565, 444, 443 などの限られた bit 数で色を保持しなければなりませんが、 展開時は 888 と同等の精度で補間が行われます。 ただし、初期の GPU では 888 より精度が低いものも存在していました。
DXT1 は endpoint の色の並び順で mode 切り替えがあります。 1bit alpha を含んだ 3色モードと alpha 無しの 4色モードが切り替わります。
パレットテクスチャ
パレットテクスチャ (Color Look Up Table) は圧縮テクスチャの一種です。 S3TC (DXT) 等のブロック圧縮アルゴリズムが普及する前は、最も多く使われている形式でした。
この方法では画素情報の他に、テクスチャ単位でカラーテーブルが必要となります。
GPU のテクスチャサンプリングは瞬間的に非常に狭い範囲のピクセルに集中しますが、 パレットでは画像全体のグローバルな情報である巨大なカラーテーブルを予めロードしておく必要がありました。 カラーテーブルはアクセスが集中するため、GPU のテクスチャサンプリングでのボトルネックになります。
またプログラマは画像とカラーテーブルの 2つのデータを同時に管理する必要が生じます。
ブロック圧縮テクスチャでは、GPU が必要とする対象の画素情報 64bit だけで必要な色を求めることができます。 64bit だけで周囲 4×4 エリアのキャッシュにもなりますし、 テクスチャユニットはフィルタリングのため 4 pixel 単位でアクセスするため効率的です。
ブロックが独立しているため画像全体で使用出来る色数が制限されません。 複数の画像を 1枚のテクスチャにシート化 (Texture Atlas) しても、ブロックが異なれば全く影響を受けないことになります。(ただし mipmap 時は要注意) 圧縮率も 4bpp でほぼ 16色パレット相当の容量で済みますし、テーブルの分だけ小さくなります。 このように GPU にとって大変都合が良かったのです。
パレットテクスチャは GPU からみてさまざまな面で不利だったので、 ブロック圧縮テクスチャが広まってからはほぼレガシー扱いとなっています。 徐々に扱いが小さくなり、現在の GPU は一部を除いてパレット形式をネイティブでサポートしていません。
そのため古いゲームで多用されたパレットによる色変えやカラーアニメーションは、今の GPU では決して低コストではなくなりました。 シェーダーを使えばパレットテクスチャ相当を再現することができますが、速度的にも劣るし手間がかかるし あまりメリットはありません。
なお S3TC よりも前に、Dreamcast で使われた PowerVR2 では VQ 圧縮テクスチャが登場しています。 パレットと同じように狭いエリアで図形データを辞書として持ち、index 参照を行います。 パレットとブロック圧縮の中間の構造となっています。