現在のリアルタイム3Dグラフィックスでは,とあるポリゴン上のピクセルに着目して陰影処理を行う場合でも,光源からの光が第三者によって遮蔽されている可能性を無視しているケースがほとんどだ。最新の3D格闘ゲームなどを見ても,手前に正拳を打ち出しても,伸ばした腕の影が胸に落ちていないことに気が付くことだろう。これは胸の陰影処理を行うときに,光が腕によって遮蔽されていることを無視して陰影処理を行っているためだ。 こうしたシーン内の複雑な遮蔽構造にまで配慮した影生成技法で,3Dゲームグラフィックスにも利用可能なものとしてはシャドウマッピング(シャドウデプスマップ)法とステンシルシャドウボリューム法の二つがあり,ここ1,2年でいくつかのタイトルがそれぞれ(または複合)を採用しはじめている。 シャドウマッピング法についての解説は今回は行わないが,「スプリンターセル」(Ubi soft)がこの方式採用タイトルの代表例だ。 DOOM3が採用するのは後者のステンシルシャドウボリューム法で,「Deus Ex:Invisible War」(EIDOS),「エバークエスト II」(SOE)などもこの技法を採用している。 ■ステンシルシャドウボリューム法とは?
まず,シーンを普通にレンダリングする。レンダリングが完了すると,視点から見たそのシーンの深度情報がZバッファに残る。以降は,これを活用してシャドウボリューム(影領域)のレンダリングを行う。 影領域の生成の発想は意外に単純で,3Dオブジェクトの輪郭(エッジ)となる頂点を,光源ベクトル方向に引き延ばすだけ(右図)。 実際の影領域のレンダリングはちょっと技巧的で,影領域は普通の表示用バッファではなく,ステンシルバッファというバッファに対して行う。
次に視点から見て影領域の裏面となる領域をステンシルバッファに"-1"演算でレンダリングする。障害物がない影領域については先ほどの表面レンダリングで"+1"された回数分だけ"-1"されるので±0となる。画面内のこの部分は,つまり影領域ではないことになるわけだ。ところが,影領域に障害物があって影領域を切り取るような位置関係になっている場合は影の裏面がレンダリングされない……すなわち"-1"されないことになり,ステンシルバッファのその位置の値は1以上になってしまう。影領域が切り取られている→つまり影が落ちている部分ということになるわけだ。ちなみに,影領域に障害物があるかどうかの判断は最初に用意したZバッファに格納されたシーンの深度情報をもとに行うことになる。 最後のレンダリングフェーズで,できあがったステンシルバッファの内容をもとに,影の色となる暗い色を付けていけばできあがりだ。ステンシルバッファを使えば特定の値で描画をマスクすることができるので,べったり影の色を塗ってもステンシルでマスクされていない部分だけに色が加わる処理となる。影の色は強制的に黒色としてもいいし,元のピクセルの色に対して適当な透明度で黒色をα合成して暗色を演出してもいい。このあたりはアーティスティックな感性に依存した部分になる。
■どの部分がGPUでアクセラレーションされるのか GeForceFX5900以上で搭載された「UltraShadow」機能は,この影領域レンダリングをさらに加速するもの。 影領域レンダリングのときに,光源位置や方向,視点からの画角,その他の3Dモデルとの位置関係等によって自ずと決まってくる,たとえ裏表の影領域をレンダリングしても必然的に±0になる範囲について,初めから影領域レンダリングをなるべくキャンセルしていこう……これがこの機能の基本コンセプトになる。この仕組みは「ステンシルシャドウボリューム技法のDepth Bounds Test最適化」として以前から考案されていたものをハードウェアサポートしたというようなイメージだ。 ■DOOM3は標準ではUltraShadowIIが活用されていない! 実際のテストに入る前に,重大かつ基本的な情報を述べておこう。 なんと,現在出荷されているパッケージ版のDOOM3では,デフォルトではUltraShdaow(II)の機能を活用しない形で起動してしまうのである。 2004年10月初旬現在の最新Forcewareドライバ61.77を利用しているGeForce FX系,GeForce6系ユーザーであれば,UltraShadow(II)の活用を有効化することができるので,まずはその方法から伝授しよう。 (1)メモ帳を起動し set r_useDepthBoundsTest"1" と入力する。 (2)これを,DOOM3のインストール・フォルダ階層下の「base」フォルダへ「autoexec.cfg」として保存。 これでOK。あとは通常通りDOOM3を起動すればいい。 ■UltraShadow(II)の効果はあるのか それでは,実際にDOOM3をGeForce6800Ultraを用いて,UltraShadowIIの有効時と無効時で,どのくらいパフォーマンスが変わるか調べてみることにした。 DOOM3のベンチマークモードを利用して策定してみた結果は下の表の通り。ちなみに,設定は基本クオリティである「VIDEO QUALITY」を最上位の「ULTRA QUALITY」とし,「ADVANCED OPTIONS」も「VERTICAL SYNC(垂直同期)」を「OFF」とし,「ANTIALIASING(アンチエリアス設定)」を「OFF」または「4X」と設定した以外はすべて「YES(有効)」としている。画面解像度は1024×768ドット,1600×1200ドットの2モードで計測した。 ●UltraShadowIIの効果の検証 ・FSAA 4X
・FSAA OFF
■テスト環境 マザーボード MSI 865PE NEO2-P CPU Pentium4 2.8E-GHz (3.36GHz動作) メモリ DDR400 デュアルチャンネル 1GB さて,結果を見る限りでは,平均フレームレートスコアで2〜3%の向上が見られる。 期待していたよりも効果が薄いが,これはUltraShadowIIの効果がベンチマークに用いられているシーンのすべてで活きてくるわけではないためだろう。ベンチマーク実行中,活きてくるシーンの出現割合が低ければ,スコア数値としては表れにくい。むしろ全体スコアで2〜3%の効果があったというのは褒めるべきことなのかもしれない。 そんなわけで,念のために時間経過におけるフレームレート変化も計測してみた。 これを見ると,折れ線グラフの谷間,すなわち比較的フレームレートが低くなる重いシーンにて,UltraShadowII有効時のほうが数フレーム分だがフレームレートが高いことが分かる。 ■GeForce6800UltraとRADEON X800XT,DOOM3を快適に動かせるのはどっちだ!? 一応,各所でやり尽くされている感もあるが,せっかくなので,DOOM3をATIの最上位GPUであるRADEON X800XTでも動作させて,GeForce6800Ultraでのパフォーマンスと比較してみた。どちらのGPUが搭載されたビデオカードを購入しようか迷っている人に参考にしてほしい。ベンチマーク実行時のクオリティ設定は前出のテストと同じで,描画品質は設定できうる限りでの最上位設定にしてある。RADEONのドライバのバージョンは10月初旬現在で最新であるCATALYST 4.9だ。 ●GeForce6800Ultra対RADEON X800XTのDOOM3パフォーマンス対決 ・FSAA 4X
・FSAA OFF
結果を見てみると,1024×768ドットモードではアンチエリアス設定の有無に関係なく両者ほぼ互角。 1600×1200ドットモードではアンチエリアス設定ありのときは,ほぼ互角なのに,なしのときにはGeForce 6800 Ultraのほうが圧倒的にRADEON X800XTを上回っている。 現在,PCゲームのプレイ環境としては1024×768ドットでアンチエリアス4Xオンあたり,あるいは1600×1200ドットでアンチエリアスなしが現実的なソリューションだと思われるので,DOOM3のような重いゲームでも,ATIやNVIDIAの最上位GPUであれば,まぁ,満足の行くフレームレートでプレイできるということだ。 なお,念のために,RADEON X800XTのテストケースにおいても"r_useDepthBoundsTest"を"1"としてUltraShadow有効設定にしてベンチマークを実行してみたがスコアに変化はなかった。 ■最後に〜DOOM3はなぜ重い?
なのになぜこんなに重いのか。最後はこれについてちょっと考えてみよう。 結論からいえば,これはやはり影技法が影響しているようだ。 ステンシルシャドウボリューム技法では,影領域生成の際に頂点を引き延ばす処理をすると説明したが,この処理系を行いやすくするために3Dモデルの各頂点に引き延ばし用のダミーポリゴンを仕込むのが一般的だ。この"仕込み"により,見た目のポリゴン数の約4倍のポリゴンが用いられることになる。重さのわりに見た目のポリゴン数が少ない……というのはこれが原因だろう。 そして光源数×3Dモデル数の影領域レンダリングが必要になり,その多くは例の処理系で±0となってビジュアル結果に結びつかない。 先進的な3Dゲームグラフィックスを見せてくれたDOOM3ではあるが,逆にこの影生成技法の取り扱いの難しさを実感させてくれたともいえる。 リアルタイム3Dグラフィックスにおける「影への挑戦」はこれからもしばらくは続くことになりそうだ。 ■おまけ〜DOOM3をMAX PAYNEみたいにプレイする方法! DOOM3はいうまでもなく1人称シューティングゲームだ。しかし,どうも,自分のキャラクターが見えないこのタイプは好きになれない……日本のゲーマーにはそんな人も少なくないようだ。 DOOM3には実は3人称視点モードが隠されていて,本稿中に作成方法を紹介した「autoexec.cfg」に, set pm_ThirdPerson "1" を追記するだけでOK。 これでゲーム中に主人公の後方上部にカメラが置かれた3人称視点でプレイできるようになる。 といっても,なぜか照準が消えてしまい,ライフゲージなどのインジケーター表示も消えてしまうので,あくまでおまけモードなのだが,一度クリアした人ならば,別ゲームのように楽しめるので一度お試しあれ。 (トライゼット西川善司)
|