アンチエイリアスとテクスチャフィルタリング
一般ユーザーはそれほど気にしていないが、GPUメーカーと3Dグラフィックスマニアにとってはホットなお題目の1つに「テクスチャフィルタリングの品質争い」と「アンチエイリアスの品質争い」がある。
本稿でも、今世代のGPUのこのテーマの最新状況について触れておくことにしよう。
ATIはRadeon HD 58x0において、テクスチャフィルタリングの品質に大幅な改善を施したと発表している。
テクスチャフィルタリングとは、ポリゴンにテクスチャを適用する際に施す高画質化処理のこと。テクスチャの1テクセルがポリゴンの1ピクセルに1対1に対応することは、実際のレンダリングではまずあり得ないので、テクスチャの拡大縮小処理が欠かせない。これを高品位に行うのがテクスチャフィルタリングだ。
このテクスチャフィルタリング処理メソッドの一つに、もっとも高品位と言われているものに「異方性フィルタリング」(Anisotropic Filtering)があるが、これはかなり重い処理系であり、これまで各GPUメーカーは、見た目に分からない範囲で、視線との相対角度、あるいは視点からの距離などに応じて、異方性フィルタリングを意図的に部分キャンセルする自称「最適化」、実質的には「手抜きによる性能稼ぎ」が行なわれていた。具体的には、特定条件下でテクセルサンプル数を減らしたり、バイリニアフィルタリングに代行させたりしていたのだ。
各縮小レベルのMIPMAPをあえて異なる単色で塗り潰したテクスチャで、画面奥に向かって伸びるトンネルの壁に対し、異方性フィルタリングを適用したテストプログラム「Texture Filter TestApp」をRadeon HD 58x0で実行した画面。色分けされたMIPMAP階層の切り替わり境界は、滑らかな同心円状であれば、手抜きがないことが証明される |
Radeon HD 58x0では、こうした「手抜き」を全てキャンセルして、全ての条件下で高品位な異方性フィルタリングを適用することを公言したのだ。これは、Radeon HD 58x0のテクスチャ処理の実効パフォーマンスにおいて、そうした手抜きの有無で差が出なくなったためだという。これは、前述したキャッシュシステムやテクスチャユニットの副次的な恩恵だと思われる。
一方のNVIDIA GeForce GTX 4x0では、8xサンプル以上のMSAA(Multi-Sampling Anti-Aliasing)のパフォーマンスを向上させるための改善が行われた。
一般に、例えば8x MSAAでは、ピクセルシェーダからの1ピクセル分の出力値(カラー値)と、その8倍解像度のZ値(深度値)を取り扱ってアンチエイリアス処理を行う。NVIDIAは古くからGeForceにて、MSAA処理に最適化したピクセル値圧縮を採用してきた。それは具体的には「あるピクセルに対応する四つのサブピクセルが同一色の場合には、四つバラバラのサブピクセル値をフレームバッファに書き出すのではなく、ひとかたまりの圧縮データとしてカラー値を書き出す」という工夫になる。GeForce GTX 4x0では、このカラー値と深度値の圧縮処理をさらに高効率化することに成功したとしている。これにより、バス帯域幅消費を削減でき、さらに前述の統合型L2キャッシュシステムとの相乗効果で、先代のGeForce GTX 2x0の2倍以上のパフォーマンス向上を達成できたとしている。「圧縮データがらみのパフォーマンス改善」と言う意味では、前述したATI Radeon HD 58x0のテクスチャユニットの一件と通ずるものがある。
Ubisoft「Tom Clancy's H.A.W.X」でのMSAAテストの結果。Geforce GTX 480(GF100)では8x MSAAを適用しても、4x MSAA比で1割弱しかパフォーマンス低下がない事が分かる |
なお、GeForce GTX 2x0までは、この圧縮を適用できるサブピクセル数に上限があったが、GeForce GTX 4x0でこの制限を「ほぼ」撤廃した。ここで「ほぼ」としたのは「アルゴリズム的にはいくつにも対応できるが、アンチエイリアスの費用対効果の面で、MSAAのサンプル数上限は16x程度までにしているためだ。
この改善の証として、16xを超えたアンチエイリアシングのモードとして、NVIDIA独自のアンチエイリアス手法であるCSAA(Coverage Sasmpling Anti-Aliasing)に、新しく「32x CSAA」モードを追加している。
CSAAとは、サブピクセルのカラーやZ値を圧縮することでメモリやメモリバス帯域幅利用量を節約し、その分で通常のMSAAよりも多くのサンプリングを行い、アンチエイリアシング処理の品質を向上させるものだ。GeForce 8800 GTX時に新設されたアンチエイリアス手法で、いうなれば「圧縮処理付きMSAA」ともいうべきものだ。
圧縮処理付き改良版MSAAといえるCSAA。ピクセルシェーダからの出力は1個しか利用せず、エッジ内外率をサブピクセル解像度個数分のZ値から判断するところまではMSAAと同じだが、サブピクセル解像度の色情報を圧縮して少なく留めるのがCSAAだ |
例えば16x CSAAでは、16か所あるサブピクセル解像度のZ値から"エッジ内外率"となる「Coverage Sample」を求めるが、サブピクセル解像度の色情報は4個しか持たない。さらに、それを圧縮して管理することにより、多少のGPU負荷と引き替えに、ボトルネックとなり得るメモリ消費量を削減することで、より高いサンプル数とパフォーマンスを発揮させる。
GeForce GTX 4x0では、前述したようにROPシステムが8x MSAAに特化した構造を装備したことにより、8x MSAAを高速に処理できるようになったため、8個分のサブピクセル色情報サンプルと24個のCoverage Sampleを元手にアンチエイリアシングを行う32x CSAAが新設されたのだ。
GeForce 8000シリーズで搭載されたCSAAでは、このような5タイプのモードが用意されていた。"Q"が付くCSAAモードは、通常のCSAAモードよりもサブピクセル解像度の色情報を多く持つ高品位なものになる |
GeForce GTX 4x0で新設された32x CSAA。CSAAで配慮されるCoverage Sample数が24となっているのは、8個のサブピクセル色情報をサンプリングするときに、対応するZ値もサンプリングしてしまうため。つまり、32x CSAAのCoverage Sample数は8+24=32個 |
GeForce GTX 4x0(GF100)における8x MSAAと32x CSAAのパフォーマンス比較グラフ。GeForce GTX 4x0において、8xMSAAと32x CSAAのパフォーマンス格差はわずか7%程度 |
テクスチャの透明テクセルと不透明テクセルの境界に対してアンチエイリアシングを適用するTAA(Transparency Anti-Aliasing、トランスペアレンシー・アンチエイリアシング)、そしてDirectX 10.0以降に新設されたACAA(Alpha Coverage Anti-Aliasing、アルファカバレージ・アンチエイリアシング)の処理においても、この32x CSAAは大きな効果を発揮する。
金網や生い茂る雑草の表現など、テクスチャを貼り付けた素ポリゴンを表示するビルボード的な表現において、"その向こう"を見透かすことができる透明テクセルを含むのが一般的だ。こうした表現では、各ピクセルに深度値の差が出ないのでアンチエリアス処理の対象外になってしまう。
この悪条件に手をさしのべたのが、透明テクセルと不透明テクセルの境界に対してアンチエイリアシング処理を適用するテクノロジー、AACAだ。
ただ、このACAAにも課題はあった。それは、そうした透明テクセルを含んだテクスチャ表現において、アンチエイリアシングは描画ピクセル単位ではなく、テクセル単位となる問題だ。そのため、金網や雑草が視点の近くに来ると、テクスチャそのものが大写しとなる関係で、4xあるいは8x程度のACAAでは、ジャギーが十分に低減できなかったのだ。
これに対し、GeForce GTX 4x0にて新設された32x CSAAならば、ACAAに応用することで、エッジ内外判定のサンプル数がGeForce GTX 2x0以前よりも劇的に多くなるため、そうしたワーストケースにおいても品質を向上させることができるというわけだ。
GeForce GTX 2x0で16x CSAA(8カラー+16 Coverage Sample)を適用時。16Coverage Sample程度では毛羽立ちの低減が不十分 |
GeForce GTX 4x0で32x CSAA(8カラー+32 Coverage Sample)適用時。16Coverage Sampleではここまで低減できる |
また、GeForce GTX 4x0では、ACAAのAPIが用意されていないDirectX 9世代SM3.0ベースのゲームアプリケーションに対しても、強制的に32x CSAAを適用させ「ACAAオーバーライド」機能を持たせたとしている。DirectX 9世代SM3.0ベースのレンダリングパイプラインでは、半透明合成にはアルファテストを実行するが(※DirectX 10以降でアルファテストは廃止された)、GeForce GTX 4x0では、このアルファテストの処理系を自動的に32x CSAA付きACAAに変換する仕組みを搭載したというのだ。
PCベースのゲームアプリケーションは急速にDirectX 10ないしは11以降に移行しつつあるので、あまり積極的に活用されるケースは少ないと思われるが、長く遊ばれている定番ゲームのユーザーには喜ばれる機能となるかも知れない。
先代Geforce GTX 2x0での結果。TAAのサンプル数が少ないために柵の縦棒が消失してしまっている |
TAAにACAAをオーバーライドさせたGeForce GTX 4x0での結果。縦棒の消失が改善されている |
こうしてみてくると、通常のアンチエイリアス処理関連については、両社共に「細かいチューニングレベルの機能改善」という感じだが、透明テクセルを含んだテクスチャに対するアンチエイリアス処理は、まだまだ進化のヘッドルームがあると感じる。
地味なテーマではあるが、今後も、ここに各社の新技術が投入されていくことだろう。