テクスチャ圧縮は使うとメモリ消費量が1/4~1/8になって簡単に帯域削減に寄与するかなり基本的な手段だ。
が、汚い。
うちのゲームも3Dモデルに適用するテクスチャにはがっつりテクスチャ圧縮を使ってるけど、2D系、例えばUIとかメニュー周りは滲みが気になりすぎて無圧縮で使っている。
というのがDirect3D9~10までの話。
Direct3D11からはBC7という新たな圧縮方法が定義されてようやく2Dまわりの画像にも使えるかな?といったところ。
というわけで、BC7の綺麗さを目で確認しましょうという記事。
普通の画像向けのテクスチャ圧縮の方法をまとめると以下の様な感じ。
- BC1
-
Direct3D9でも使える。パンチ抜きのテクスチャならこれがいい。圧縮率は1/8。かつてDXT1と呼ばれていたもの。
- BC2 & BC3
-
Direct3D9でも使える。画像のアルファにビット情報を少なめに割り振るか多めに割り振るか程度の差。圧縮率は1/4。かつてDXT2~DXT5と呼ばれていたものに相当。アルファ情報も他のRGBと同じように扱いたいならBC3を選ぶこと。
- BC4, 5, 6
-
法線テクスチャとかHDRテクスチャ向け。今回は範囲外。
- BC7
-
Direct3D11から使える(一部のグラボではDirect3D10から)。簡単にいえば圧縮する際に4x4のブロックごとに最も誤差が少ない圧縮方式を切り替えていく方式。圧縮率は1/4。実際にゲームで利用する際には単にハードウェアがデコード方式を見て自動でデコードしてくれるので速度の点ではBC1~3に対して何のデメリットもないが、圧縮時はいろんな圧縮方式を切り替えるためやたら時間がかかる。あとマイクロソフトが発表時に配布してたエンコーダがバグっててまともにエンコードできないので出足が躓いた実力あるけどクソ規格みたいな面あり。
ってなわけでフォーマット自体の詳細はDirect3D SDKに事細かに載ってるし、概要はこことかこことかでも見るといいかも。
で、肝心要の画質比較ですが3Dモデル用はBC1~3でも割とそんなに問題なかったので、今回はうちの幻想の輪舞から2Dメニュー用の咲夜さんにお出まししてもらいました。
左から順に「無圧縮の元画像」「BC3(DXT5)」「BC7」です。
またBC3とBC7の画像の下側にはオリジナルの無圧縮画像からの誤差成分を表示してあります。
白い部分ほど圧縮することによって汚くなった場所。
BC3もBC7も全体的に線画部分、色の変化が激しい部分がクソなことになっていることが見て取れます。
特にBC3が悲惨なことになっていそうです。
と言うかこの画像の顎の部分とか見るだけでも色が妙にブロック上に滲んでいることがわかります。
(なお、BC2もエンコードしましたが今回の画像ではほぼほぼBC3と同じだったので割愛。原理上、まぁそうなるな感)
特に誤差が激しくて下側の画像が白っぽくなっている顎付近を拡大してみましょう。
わぁ、ファンタスティック!
BC3は汚すぎて色の変化が激しいリボン周りと顎の部分がヤバイことになってます。
あと割りとみんなが真っ先に見る瞳の部分もグラデが謎のブロック上になって解像度感が下がってしまっています。
一方、BC7のほうはよくよく目を凝らすと襟元にリボンの緑が若干にじみ出ているところがあるかな……?程度でこれなら2Dメニューに使ってもあまり問題はなさそうです。
すばらしいですね、BC7。
いつかつくろうと思っている新型のオレオレエンジンではBC7を積極的に使っていこうと思っています。
オレオレエンジンに先立って作ったテクスチャオーサリングツールはもうBC7にも対応済みなのでいつでも安心。
なお、BC7はエンコード手法が現状では限りなくファッキンなので内製のオーサリングツールでも用意しておいたほうがいいでしょう。
上の誤差表示もオーサリングツールで一発ポンです、便利。
BC7のエンコード手法がファッキンな現状を俺が知ってる限りでまとめると
- DirectX 11 SDK(2010June)のサンプルディレクトリに入ってるtexconvex.exe
-
BC7発表と同時に公開されたサンプル。GPUのcompute使用でクソ早いができあがった画像は謎のノイズであり決して失った過去は取り戻せないことだけを教えてくれる哲学的な存在。なお、CPUエンコード(単にD3D11のSoftwareドライバで圧縮するだけ)もできる。今回の記事のBC7画像はこのツールのCPUエンコードで行ったが1024x1024の画像で2時間かかりました。実用的すぎて涙が出た。
- DirectXTexのtexconv.exe
-
今となってはこれ使おう。開発時はGPUエンコード、リリース時はCPUエンコードしておけばいい。
さらに普通のテクスチャのCUBETYPE的使い分けとしては以下のように運用してます。
- BC1
-
αなし or パンチ抜きの場合これ。1/8の圧縮率すばらしい。
- BC7
-
何も考えずに残り全部これ。
- BC2 or 3
-
BC7未対応ハードウェアの場合にフォールバックしてくる先。
コメントをいただけるとスタッフが喜びます。同人ゲームのサポートは
メールフォームからお願いします。
コメントをいただけるとスタッフが喜びます。同人ゲームのサポートはメールフォームからお願いします。