オプション扱いですが Direct3D12/Direct3D11.3 では新たに
ASTC 圧縮テクスチャがサポートされています。
ASTC は OpenGL ES 3.0 で導入された新しい圧縮形式です。
DirectX では BC 系以外では初であり、モバイルからの逆輸入になります。
これで dds ファイルに ASTC 画像を格納できるようになりました。
下記ページの一覧表に DXGI_FORMAT_ASTC_* を追加しています。
ASTC について以前の解説
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
● 64bit 単位の圧縮
圧縮テクスチャの多くは 4×4 block 単位で 64bit に圧縮します。
例えば下記のフォーマットは 64bit です。
DXT1(BC1), ETC1, ETC2(RGB), ATITC(RGB), PVRTC 4bpp, PVRTC2 4bpp
64 bit/16 pixel なので 1pixel あたり 4bit (4bpp)。
DXT3/5 (BC2/3) や ETC2-EAC などアルファ付きフォーマットは 128bit 8bpp ですが、
内部的には 64bit/block の構造が 2個並んでいるだけです。
処理の単位はあくまで 64bit になります。
DXT1 (BC1) +-----------+ |COLOR 64bit| +-----------+ DXT3 (BC2) DXT1 + A4 +-----------+ +-----------+ |COLOR 64bit| |ALPHA 64bit| +-----------+ +-----------+ DXT5 (BC3) DXT1 + BC4 +-----------+ +-----------+ |COLOR 64bit| |ALPHA 64bit| +-----------+ +-----------+ ETC2 +-----------+ |COLOR 64bit| +-----------+ EAC (EAC-R11) +-----------+ |RED 64bit| +-----------+ ETC2-EAC ETC2 + EAC +-----------+ +-----------+ |COLOR 64bit| |ALPHA 64bit| +-----------+ +-----------+ EAC_RG11 EAC + EAC +-----------+ +-----------+ |RED 64bit| |GREEN 64bit| +-----------+ +-----------+
● 128bit 単位の圧縮フォーマット
64bit/block を第一世代とすれば、BC6H/BC7 は 128bit/block の第二世代の
圧縮テクスチャに相当します。
64bit では 16個の index 値がエンコードスペース大半を占めるので
あまり複雑なアルゴリズムを選ぶことができませんでした。
追加の圧縮情報が増えるとベースカラー (Endpoint) の bit を減らすしかないので
カラー精度と圧縮アルゴリズムのどちらを取るかトレードオフになります。
128bit/block ならスペースに余裕があるためフォーマットの自由度が増します。
BC6H/BC7 はこの追加容量を、HDR 対応化や高画質化に割り当てています。
8~14 種類のアルゴリズム選択、Partition 分割による複数の Endpoint セットなど
より複雑なエンコードが行われています。
画質が向上する反面 BC6H/BC7 は容量が増えます。
単純な RGB カラーでは DXT1 の 2倍なので、圧縮率を優先する場合は BC7 は
あまり出番が無いかもしれません。
● 圧縮率とブロックサイズ
block あたりの容量を減らさなくても、block サイズを増やせば圧縮率が上がります。
その代表例が PVRTC/PVRTC2 の 2bpp フォーマットです。
PVRTC は 64bit/block ですが、block サイズを 8×4 に広げることで 2bpp まで
圧縮することができます。
ただしこの場合 index 数が増えるためピクセルの階調が減ります。
index は 8×4 = 32個必要なので 1pixel あたり 1bit になるためです。
● ASTC
ASTC は 128bit/block の第二世代に属し、128bit エリアをフルに使った
複雑なエンコードを行います。
しかしながら block サイズを可変にすることで、同時に高い圧縮率も実現しています。
4×4 block の場合は BC6H/BC7 同様 8bpp ですが、
6×6 block ではおよそ 3.6bpp、
8×8 block では 2bpp と
目的に合わせて圧縮率を選ぶことができます。
もちろん圧縮率を上げると画質はそれなりに下がります。
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
ASTC の注意点は、これまで絶対安全だった 256×256 や 512×512 といった
2^n サイズのテクスチャが必ずしも割り切れないことです。
例えば ASTC 6×6 の場合、 256×256 サイズのテクスチャも内部的には
258×258 でデータを持つことになります。
テクスチャローダーでは注意が必要です。
bpp が割り切れる整数値にならないことと、テクスチャサイズで端数が生じることから
ASTC 対応のためにいくつかの手直しが必要になるかもしれません。
関連ページ
・HYPERでんち: 圧縮 Texture 一覧
・HYPERでんち: 解説記事一覧
関連エントリ
・iPad Air 2 (Apple A8X) の GPU
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)