ユーザ用ツール

サイト用ツール


opengl:textures

圧縮 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 - - - - - -
  1. Android 向け GPU では ETC1 が唯一の共通フォーマットとなります。
    • Android OS 2.2 (Froyo) では Java に ETC1 の API も追加されています。
  2. iOS では PVRTC が共通フォーマットになります。
  3. ETC2 は ETC1 の上位互換性を保っているので、ETC2 対応 GPU は ETC1 も使用できます。
  4. 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 資料

解説記事

圧縮テクスチャの解説

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 参照を行います。 パレットとブロック圧縮の中間の構造となっています。

opengl/textures.txt · 最終更新: 2015/05/27 00:15 by oga