NVIDIAがATIに噛み付いた「テクスチャの異方性フィルタリング」ってなに? 前編

 今年(2004年)も白熱するNVIDIAとATIのGPU合戦だが,この5月,NVIDIAがATIのRADEON X800シリーズについて異議を申し立てる声明を出したことがあった。日本のメディアでも報じられたので,ご存じの人もいることだろう。
 この声明の中でテクスチャフィルタリングのパフォーマンスについて言及している部分があり,これが業界で密かながらも物議を醸している。久々となるこのコーナーだが,今回はこのテーマについて触れてみたいと思う。

NVIDIAがRADEON X800の異方性フィルタリングの動作について異議を申し立てた?

 GeForce6800シリーズとRADEON X800シリーズのパフォーマンスを比較した場合,テクスチャフィルタリングで異方性フィルタリング(Anisotropic Filtering)を適用した場合のパフォーマンスは,RADEON X800シリーズのほうが非常に高いという結果になる。
 テクスチャフィルタリング処理でGeForce6800シリーズのピクセルシェーダユニットは,4TAPフィルタまでならばパフォーマンス低下無しで処理できるとされていたのだが,にもかかわらず,3DベンチマークテストなどにおいてはRADEON X800シリーズに及ばなかった。
 これにカチンときた(かどうかは分からないが)NVIDIAが,これは何かおかしいということで,前述の声明の中で異議を申し立てたというわけなのだ。
 この話題を取り扱うにあたり,編集部から「まずはテクスチャフィルタリングというものについての基本事項のおさらいをしてください」という指示があったので,今回はそこから始めたいと思う。

テクスチャフィルタリングってなに?

 PC-3Dゲームファンにとっては,比較的目に触れる機会の多い「テクスチャフィルタリング」というキーワード。フルスクリーン・アンチエリアス(FSAA)処理とごちゃ混ぜに認識されている場合も多いが,処理系としてはまったく別物だ。
 テクスチャとはポリゴンに貼り込む画像――すなわちステッカーのようなもの――という認識があると思うが,実際のテクスチャデータそのものはデジカメの写真データのような,いわば画像データである。
 だから,色情報を持った画素データが何ドット×何ドット……みたいな感じでビデオメモリに格納されている。画面を構成する画素を「ピクセル」というが,これと同じようにテクスチャを構成する画素を「テクセル」という。
 実際にポリゴンにテクスチャを貼り付けるとき(このプロセスをテクスチャマッピングという),そのポリゴンが視点から遠かったり近かったり,あるいは傾いていたりする関係で,ポリゴンを構成するピクセルにテクセルが1対1にうまく対応するケースはほとんどない。
 一口にテクスチャマッピングとはいうが,実際のポリゴンへの貼り付け処理時にはテクスチャを拡大/縮小したり,変形したりする作業が必要になるわけだ
 テクスチャフィルタリングとはこのときの操作を高品質に行い,見栄えを良くする処理系と考えると,概念的に分かりやすいだろう。

テクスチャフィルタリングを適用しないとどうなる?

 テクスチャフィルタリング処理をまったく適用しないとどうなるのか。
 ゲームファンであれば,昔懐かしい初代PlayStationやセガサターンの3Dグラフィックスを思い浮かべればいい。拡大されたテクスチャがモザイク模様のような映像になっていたと思う。あの状態だ。

「TOMBRAIDER美しき逃亡者」より。テクスチャフィルタリング無しでの画面と,カーテン部を4倍に拡大図したショット(拡大写真はこちら

 視点に近い手前では,生のテクセルが拡大表示されて矩形形状が非常に目立ってしまっている。一方,奥まったところはごちゃごちゃしていてディテール感が欠如している。
 この方式は,ポリゴンを構成するピクセルに"最も適合すると判断される"テクセルを一つだけ取ってきて貼り付けるだけの処理系で成り立っている。つまり,1ピクセルに対するテクスチャマッピングを行うときに,テクスチャユニットがビデオメモリから取り出してくるテクセルは一つのみということであり,パフォーマンス的には無駄がない。
 なお,ここでは「テクスチャフィルタリング無し」として分類しているが,この処理系自体をボックスフィルタと呼ぶこともある。

コストパフォーマンスの高いテクスチャフィルタリング〜バイリニアフィルタリング

 最も原始的で,しかも効果はそれなりに高いテクスチャフィルタリングが「バイリニアフィルタリング(Bilinear Filtering)」だ。
 これは,テクスチャマッピング時に4テクセル分を取り出し,テクスチャの拡大率を吟味した形でこの4テクセルの色を混ぜ合わせて最終的なテクセルの色を決定する方式。フィルタリング無しの画像と比較すると,当然4倍のテクセル読み出しが発生することになる(実際にはテクスチャ・キャッシュが利いてくるのでそれほど重くはならない)。
 さて,このバイリニアフィルタリングとは具体的にどういうイメージの処理になるのか。
 少々極端な例になるが,例えばあるテクスチャの,あるテクセルが"赤"で,その隣のテクセルが白だったとする。このテクスチャを拡大して貼り込むとき,テクスチャフィルタリング無しでは,この赤テクセルに対応するポリゴン上のピクセルすべてが赤に,白テクセルに対応するピクセルすべてが白になってしまう。ところがバイリニアフィルタリングは,この赤テクセルと白テクセルの間が,赤から白へのカラーグラデーションが塗り込まれることになるのだ。
 いわゆる二次元的な線形補間が行われるというわけで,"Bi-Linear"フィルタリングというわけ。コンシューマ機ではNINTENDO 64がこの方式のテクスチャフィルタリング機能を内蔵していた。いうまでもないが,昔から今にかけてほとんどのGPUにこの処理系が内蔵されている。

バイリニアフィルタリング適用時のショット。「無し」時には目立っていたテクセルのモザイク感がウソのように消えている。(拡大写真はこちら

 「フィルタリング無し」時に見られたモザイク模様がほとんど姿を消しており,「いい感じ」になっている。しかし全体的にぼやけた感じになっており,しかもそのぼやけ方に境界線のようなものがあることにも気づくだろう

バイリニアフィルタリングの欠点

 この方法の第一の欠点は,一律して近傍4テクセルで線形補間をしてしまうところにある
 テクスチャを貼り付けるポリゴンが視線に対して直行しているとき,言い換えればポリゴンとディスプレイ面が平行ときには,この処理系は理論的に正しい。
 しかし,視線に対してポリゴンが傾いているとき(画面内のほとんどのポリゴンがそうなっているはずだが)には,その奥行きや傾きに配慮した形でテクセルを選択して補間してやらないと理論的におかしくなる。常に,ある着目したテクセルの周囲4テクセルの色だけで補間するこの方法では,正しい補間にならないのだ。

 第二の欠点は,テクスチャのぼやけ方の境界線が見えてしまうこと
 視点から遠いところにあって小さく見えるポリゴンにテクスチャを貼るときには,バイリニアフィルタリング処理が適用できないので,テクスチャの縮小処理が必要になる。高品位な縮小を行うには,複数のテクセルの色の平均値を求めなければならず,縮小率が上がるにつれてより多くのテクセルを読み出して平均値を計算しなければならない。
 これをリアルタイムにやっていると効率が悪いので,あらかじめ縦横の辺を2分の1ずつに縮小させた,面積比でいうと4分の1,16分の1,64分の1……と縮小したテクスチャをあらかじめ用意しておき,この縮小テクスチャからテクセル読み出しをする仕組みが考え出された。この縮小テクスチャの仕組みが「MIP-MAP」というものだ

MIP-MAPの例。オリジナルテクスチャをMIP-MAPレベル0として,縮小率が上がるごとにMIP-MAPレベルは1,2,3……と規定される。MIP-MAPを含んだとしても,テクスチャのサイズは必ず133%以下となり,それほど大きくならない。1+(1/4)+(1/16)+……を計算してみれば納得いくはずだ。

 そんなわけで,一般的にバイリニアフィルタリングを使用するときにはMIP-MAPも合わせて活用する。テクスチャを拡大して適用するときはバイリニアフィルタリング,逆に縮小して適用するときはMIP-MAPを活用してテクセルを取り出す……という感じになる。
 MIP-MAP中のどの縮小レベル(MIP-MAPレベル)の縮小テクスチャからテクセルを取り出してくるかは,視点からの距離などに対応して決められるが,裏を返せば,視点からの距離によって使用されるテクスチャのMIP-MAPレベルが変化するということである
 「ドライブゲームの道路」のような,同一テクスチャ(道路の場合ならばアスファルト模様テクスチャ)が手前から奥に向かって連続的に貼り付けられるシーンでは,このMIP-MAPレベルの切り替えポイントが可視化されてしまう。
 バイリニアフィルタリング自身の欠点……というよりは,この方式の限界点ともいえるかもしれない。

「MAXPAYNE2」でバイリニアフィルタリングを適用した1シーンより。一見問題ないように見えるが,画面中央付近に,テクスチャのボケ方が劇的に変わる水平線状の境界線があるのが分かる。分かりやすい箇所を4倍に拡大してみると,MIP-MAPの切り替えポイントが,目に見える形で現れている(拡大写真はこちら



MIP-MAPの切り替えポイントが可視化されないテクスチャフィルタリング〜トライリニア・フィルタリング

 そうしたバイリニアフィルタリングの弱点を克服したバージョンアップ版ともいうべきテクスチャフィルタリング技法が,「トライリニア・フィルタリング」だ。
 これは,バイリニアでは無視されていた「奥行き」に,ある程度配慮した形でテクセルを線形補間しようとするアプローチだ。
 実際のトライリニアフィルタリングの処理系は,視点からの奥行き距離に対応した,1ペアのMIP-MAPテクスチャ(例えばレベル0と1のMIP-MAP)からテクセルを取り出してバイリニア・フィルタリングを適用していく……といった感じになる。もっと具体的にいうと,二つのMIP-MAPテクスチャからテクセルをそれぞれ四つずつ,合計八つのテクセルを取り出し,これら8テクセルの色の値をもとに,奥行きに配慮しつつ,線形補間演算を行って最終的なテクセル色を決定していくことになる。

TOMBRAIDERのトライリニアフィルタリング適用時のショット。パッと見た感じではバイリニアフィルタリングと大差ないように思えるが……
4倍の拡大図でも,実際ほとんど差がない。それでは,トライリニアフィルタリングの利点とは?(拡大写真はこちら

 常に二つの異なるMIP-MAPレベルのテクスチャからテクセルを読み出して処理していくので,バイリニアフィルタリングで見られたような,MIP-MAPレベルの切り替えポイントのようなものが可視化されることもない。
 しかし,視線とポリゴンの向きの関係は依然として無視されたままの技法であるため,奥に行けば行くほどテクスチャのディテール感が失われている感じは,それほどバイリニアフィルタリングとの大差はない印象だろう。

MAX PAYNE2におけるトライリニアフィルタリング適用時のショット。手前から奥にかけてボケ方が一様で自然な感じになっている。これがトライリニアフィルタリング適用時のメリット。バイリニアフィルタリングとトライリニアフィルタリングの差,それはMIP-MAP境界が可視化されないこと(拡大写真はこちら


傾きにも配慮した,現時点での汎用テクスチャフィルタリング技法の最高峰〜異方性フィルタリング

 例えば新聞紙をやや寝かせた感じでパースを付けてみると,手前の文字は大きく見えるが奥の文字は小さく見える。遠近があるので当たり前のことだ。小さく見える奥の文字は密集して見える……つまりは狭い範囲に多くの情報が密集しているわけで,テクスチャマッピングのケースにおいても,角度がきつい場合や遠景ポリゴンへのテクスチャ適用のときには,より広範囲のテクセルを取り出して吟味する必要があることになる。
 トライリニアではMIP-MAPに配慮したテクセル取り出しを行って,線形補間を行うものの,その取り出し先が視線角度などに配慮されず一意的に行われてしまっていた。バイリニアやトライリニアにおいて,奥であれば奥に行くほど,そして角度がきつければきついほどディテール感が失われていたのには,このような理由があったのだ。

 「異方性フィルタリング」(別名アニソトロピックフィルタリング:Anisotropic Filtering)は,視線とポリゴンの角度関係に応じて最適なテクセルを取り出し線形補間するテクスチャフィルタリング技法だ
 「異方性」という言葉の響きは少々難しいイメージがあるが,3Dグラフィックスではよく使われる傾向にある。意味合い的には「臨機応変に,やることを切り換える手法」というふうに捉えればいいだろう。ちなみに,3Dグラフィックスにはほかにも「異方性ライティング」という用語がある。これは視線や光源の位置関係によって反射モデルを切り換えるライティング技法で,金属面の陰影処理時に用いられる。

TOMBRAIDERの異方性フィルタリングを適用したショット。奥のカーテン模様に注目。逆に手前のほうはトライリニアフィルタリングとほとんど変わらない。トライリニアフィルタリングと異方性フィルタリングとで奥のカーテン模様がどのように変わったか。異方性のほうがディテール感が高いのが一目瞭然(拡大写真はこちら

 映像を見ると分かるように,手前から奥まで,一定のディテール感が保たれている様子がよく分かる。バイリニアやトライリニアではボケボケだった奥の密集域でも,テクスチャ模様が非常に鮮明に見えている。

MAX PAYNE2の異方性フィルタリング適用時のショット。奥側の絨毯模様のディテール感は圧倒的だ。もちろんMIP-MAPの境界も可視化されていない。
トライリニアフィルタリング適用時,異方性フィルタリング適用時のそれぞれにおける最奥部の絨毯模様の4倍の拡大ショットを見ると,異方性フィルタリングではここまで正確に絨毯模様が出ることが分かる(拡大写真はこちら



まとめと次回予告

 モニターのサイズが17インチ前後で,画面解像度が1024×768ドット以上あれば,アンチエイリアス処理を適用しなくても,プレイ時にはほとんどジャギーを感じることはない。
 ところが,テクスチャフィルタリングに関しては,画面解像度を上げた分だけバイリニアやトライリニアの"ボケ"が目立ってくる。
 ハイクオリティなゲームグラフィックスを楽しむためには,もはや異方性フィルタリングは必要不可欠といっても過言ではないと思う
 さてさて,次回は,ドライバソフトのプロパティ画面にある「異方性フィルタリングの設定」における2X,4Xとはどういった意味を持つのかを解説しつつ,その後に本題となるATIのRADEON X800シリーズの異方性フィルタリングがどうして低負荷なのかを考察していくことにしよう。

= 後編へ=

▲ 上に戻る