Direct3D 12 と ASTC 圧縮 Texture

オプション扱いですが Direct3D12/Direct3D11.3 では新たに
ASTC 圧縮テクスチャがサポートされています。
ASTC は OpenGL ES 3.0 で導入された新しい圧縮形式です。
DirectX では BC 系以外では初であり、モバイルからの逆輸入になります。

MSDN DXGI_FORMAT

これで dds ファイルに ASTC 画像を格納できるようになりました。
下記ページの一覧表に DXGI_FORMAT_ASTC_* を追加しています。

圧縮 Texture

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)