OpenGL の圧縮テクスチャ (3) BPTC, BC6H/BC7

DXT1/DXT3/DXT5/ETC1 等の圧縮テクスチャは、カラー値 RGB をピクセル当たり
4bit (4bpp) に変換しています。
DXT3/5 など Alpha 付きの場合は 8bpp ですがカラー成分は 4bpp のままです。
Alpha チャンネル単独で 4bpp 分追加しています。

この垣根を無くして 8bpp 分をまるごとカラー情報に割り当てられれば、
より高品位な画像圧縮ができると考えられます。

単純に DXT1 相当と考えても、ちょうどテクスチャ 2枚分の情報を格納することが
できるわけです。4×4 エリアを 2分割してそれぞれに DXT1 相当の画素を入れたり、
保持しているベースカラーの精度を上げる事も考えられます。

Direct3D 11 で追加されたテクスチャフォーマット BC6H/BC7 はこのように
8bpp (4×4 block 128bit) を自由にリフォーマットして多くの情報を詰め込みます。

調べてみると、単に情報を増やすだけでなく画像に合わせてさまざまなモードを
選択できる自由度の高さが強みのようです。
データの格納方法もさまざまで、ベース値の精度も複数選択できます。
やはり 4×4 block は分割可能のようです。ただし ETC1 のような 4×2 ではなく
プリセットされた 32/64 通りから選べます。
その分ビット単位で情報の配置が変化するため非常に複雑な構造になっています。

・BC6H HDR 対応。16bit float に拡張
・BC7 SDR で解像度を優先

OpenGL にも BPTC と呼ばれる BC6H/BC7 相当の圧縮フォーマットが追加されています。
RADEON HD 5850 / GeForce GTX 460 で対応していることが確認できました。

DXGI(DirectX)                OpenGL
-----------------------------------------------------------------------
DXGI_FORMAT_BC6H_UF16        GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
DXGI_FORMAT_BC6H_SF16        GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
DXGI_FORMAT_BC7_UNORM        GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
DXGI_FORMAT_BC7_UNORM_SRGB   GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB

実際に Direct3D 11 SDK のコンバータ texconvex で変換した bc6h_uf16/sf16/bc7
画像を OpenGL 4.1 で描画できています。
S3TC(BC1/2/3) や 3DC(BC4/5) と同じようにバイナリで互換性が保たれているようです。

OpenGL や OpenGL ES 2.0 向け GPU で使える圧縮テクスチャの種類と対応をこちらにまとめました。

OpenGL/OpenGL ES 2.0 テクスチャフォーマットまとめ

関連エントリ
OpenGL の圧縮テクスチャ (2) 法線圧縮
Android OpenGL ES 2.0 の圧縮テクスチャ