title

 DOOM3はその影生成にステンシルシャドウボリューム法を採用しており,これがアクセレーションできるNVIDIA系GPUのほうが相性がよいとされている。はたしてそれは本当なのだろうか? ここではDOOM3の影生成技法の基本的な知識の再確認も含めて,この点に迫ってみたい。

■3Dゲームグラフィックスに足りなかったもの〜それは"まとも"な影表現

日本での本格サービス開始が決定した,あの「エバークエスト II」も,影生成にはステンシルシャドウボリューム法を採用する
 現在,リアルタイム3Dグラフィックスにおける影生成技法で完璧な方法は編み出されておらず,毎年SIGGRAPHなどでも新しい論文が出てきてはいるが,根本的な解決に至っていない。
 現在のリアルタイム3Dグラフィックスでは,とあるポリゴン上のピクセルに着目して陰影処理を行う場合でも,光源からの光が第三者によって遮蔽されている可能性を無視しているケースがほとんどだ。最新の3D格闘ゲームなどを見ても,手前に正拳を打ち出しても,伸ばした腕の影が胸に落ちていないことに気が付くことだろう。これは胸の陰影処理を行うときに,光が腕によって遮蔽されていることを無視して陰影処理を行っているためだ。
 こうしたシーン内の複雑な遮蔽構造にまで配慮した影生成技法で,3Dゲームグラフィックスにも利用可能なものとしてはシャドウマッピング(シャドウデプスマップ)法とステンシルシャドウボリューム法の二つがあり,ここ1,2年でいくつかのタイトルがそれぞれ(または複合)を採用しはじめている。
 シャドウマッピング法についての解説は今回は行わないが,「
スプリンターセル」(Ubi soft)がこの方式採用タイトルの代表例だ。
 DOOM3が採用するのは後者のステンシルシャドウボリューム法で,「Deus Ex:Invisible War」(EIDOS),「エバークエスト II」(SOE)などもこの技法を採用している。

■ステンシルシャドウボリューム法とは?

シャドウボリュームを可視化したところ(DirectX SDKのサンプルより)
 ステンシルシャドウボリューム法とはどういったものなのか。最初に概念を解説しよう。
 まず,シーンを普通にレンダリングする。レンダリングが完了すると,視点から見たそのシーンの深度情報がZバッファに残る。以降は,これを活用してシャドウボリューム(影領域)のレンダリングを行う。
 影領域の生成の発想は意外に単純で,3Dオブジェクトの輪郭(エッジ)となる頂点を,光源ベクトル方向に引き延ばすだけ(右図)。

 実際の影領域のレンダリングはちょっと技巧的で,影領域は普通の表示用バッファではなく,ステンシルバッファというバッファに対して行う。
まずはシャドウボリュームの表面にあんる部分に+1を書き込む
シャドウボリュームの裏面には−1を
演算して+1以上になった部分が影として見える部分になる (実際には一つのステンシルバッファに対して表面の影領域のレンダリングをして,そのあと裏面の影領域をレンダリングするので,結果としてステンシルバッファ に影となるべき領域が残ることになる)
 まずは,視点から見て影領域の表面となる領域をステンシルバッファに"+1"演算でレンダリングする。光源が複数あったり3Dオブジェクトが重なり合っているときなどは,画面内の影領域の表面となる位置には+1が重複して,値は大きくなるわけだ。
 次に視点から見て影領域の裏面となる領域をステンシルバッファに"-1"演算でレンダリングする。障害物がない影領域については先ほどの表面レンダリングで"+1"された回数分だけ"-1"されるので±0となる。画面内のこの部分は,つまり影領域ではないことになるわけだ。ところが,影領域に障害物があって影領域を切り取るような位置関係になっている場合は影の裏面がレンダリングされない……すなわち"-1"されないことになり,ステンシルバッファのその位置の値は1以上になってしまう。影領域が切り取られている→つまり影が落ちている部分ということになるわけだ。ちなみに,影領域に障害物があるかどうかの判断は最初に用意したZバッファに格納されたシーンの深度情報をもとに行うことになる。
 最後のレンダリングフェーズで,できあがったステンシルバッファの内容をもとに,影の色となる暗い色を付けていけばできあがりだ。ステンシルバッファを使えば特定の値で描画をマスクすることができるので,べったり影の色を塗ってもステンシルでマスクされていない部分だけに色が加わる処理となる。影の色は強制的に黒色としてもいいし,元のピクセルの色に対して適当な透明度で黒色をα合成して暗色を演出してもいい。このあたりはアーティスティックな感性に依存した部分になる。

セルフシャドウも自ずと考慮されるのがステンシルシャドウボリューム技法の特長でもある

■どの部分がGPUでアクセラレーションされるのか

GeForce6シリーズのラスタライズ処理ユニット(Rasterization Operator:ROP)のブロック図。このユニットがピクセルレンダリングパイプラインの本数分だけある。Z処理を行うだけという状況下では,図中のカラー処理(C ROP)ユニットはZ ROPユニットとして活用できるため,16ピクセルレンダリングパイプラインのGeForce6800Ultraの場合ならば,パイプライン数の倍となる,クロック当たり32ピクセル分のZ処理が可能
 ATIならばRADEON9500以上,NVIDIAならばGeForceFX以上で,ステンシルバッファへの影領域のレンダリングフェーズを高速化することができる。これらのGPUはDirectX 9でサポートされた2サイドステンシル操作機能に対応しており,影領域の表面と裏面のレンダリングを同時に1パスで行うことができるのだ。
 GeForceFX5900以上で搭載された「UltraShadow」機能は,この影領域レンダリングをさらに加速するもの。
 影領域レンダリングのときに,光源位置や方向,視点からの画角,その他の3Dモデルとの位置関係等によって自ずと決まってくる,たとえ裏表の影領域をレンダリングしても必然的に±0になる範囲について,初めから影領域レンダリングをなるべくキャンセルしていこう……これがこの機能の基本コンセプトになる。この仕組みは「ステンシルシャドウボリューム技法のDepth Bounds Test最適化」として以前から考案されていたものをハードウェアサポートしたというようなイメージだ。

DOOM3の1シーンより このシーンの影領域のジオメトリを強制的に可視化した状態。最終的に可視化されないが,引き延ばされた頂点によってできた影領域がシーン内に縦横無尽に張り巡らされているのが分かる UltraShadowII,すなわち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

1024x7681600x1200
UltraShaodwII ONUltraShaodwII OFFUltraShaodwII ONUltraShaodwII OFF
59.458.23231.4

・FSAA OFF
1024x7681600x1200
UltraShaodwII ONUltraShaodwII OFFUltraShaodwII ONUltraShaodwII OFF
73.5725756.1


■テスト環境
マザーボード MSI 865PE NEO2-P
CPU Pentium4 2.8E-GHz (3.36GHz動作)
メモリ DDR400 デュアルチャンネル 1GB

 さて,結果を見る限りでは,平均フレームレートスコアで2〜3%の向上が見られる。
 期待していたよりも効果が薄いが,これはUltraShadowIIの効果がベンチマークに用いられているシーンのすべてで活きてくるわけではないためだろう。ベンチマーク実行中,活きてくるシーンの出現割合が低ければ,スコア数値としては表れにくい。むしろ全体スコアで2〜3%の効果があったというのは褒めるべきことなのかもしれない。
 そんなわけで,念のために時間経過におけるフレームレート変化も計測してみた。
 これを見ると,折れ線グラフの谷間,すなわち比較的フレームレートが低くなる重いシーンにて,UltraShadowII有効時のほうが数フレーム分だがフレームレートが高いことが分かる。

graph

■GeForce6800UltraとRADEON X800XT,DOOM3を快適に動かせるのはどっちだ!?

 一応,各所でやり尽くされている感もあるが,せっかくなので,DOOM3をATIの最上位GPUであるRADEON X800XTでも動作させて,GeForce6800Ultraでのパフォーマンスと比較してみた。どちらのGPUが搭載されたビデオカードを購入しようか迷っている人に参考にしてほしい。ベンチマーク実行時のクオリティ設定は前出のテストと同じで,描画品質は設定できうる限りでの最上位設定にしてある。RADEONのドライバのバージョンは10月初旬現在で最新であるCATALYST 4.9だ。

●GeForce6800Ultra対RADEON X800XTのDOOM3パフォーマンス対決
・FSAA 4X
1024x7681600x1200
GeForce6800Ultra59.432
RADEON X800XT58.132.8
※GeForce6800UltraはUltraShadowII有効設定

・FSAA OFF
1024x7681600x1200
GeForce6800Ultra73.557
RADEON X800XT72.549.9
※GeForce6800UltraはUltraShadowII有効設定

 結果を見てみると,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はなぜ重い?

近寄ると結構カクカクしているDOOM3のキャラクタたち。実は各キャラクタごとのポリゴン数はQUAKE3からさほど増加していないのだという
 さて,DOOM3のグラフィックスは,ディテールを法線マップによる疑似的な凹凸に置き換えているので,それなりに見応えのあるビジュアルにはなっているが,よく見ればキャラクターの頭部輪郭はカクカクしており,あまりポリゴン数が多くないことに気が付く。
 なのになぜこんなに重いのか。最後はこれについてちょっと考えてみよう。
 結論からいえば,これはやはり影技法が影響しているようだ。
 ステンシルシャドウボリューム技法では,影領域生成の際に頂点を引き延ばす処理をすると説明したが,この処理系を行いやすくするために3Dモデルの各頂点に引き延ばし用のダミーポリゴンを仕込むのが一般的だ。この"仕込み"により,見た目のポリゴン数の約4倍のポリゴンが用いられることになる。重さのわりに見た目のポリゴン数が少ない……というのはこれが原因だろう。
 そして光源数×3Dモデル数の影領域レンダリングが必要になり,その多くは例の処理系で±0となってビジュアル結果に結びつかない。
 先進的な3Dゲームグラフィックスを見せてくれたDOOM3ではあるが,逆にこの影生成技法の取り扱いの難しさを実感させてくれたともいえる。
 リアルタイム3Dグラフィックスにおける「影への挑戦」はこれからもしばらくは続くことになりそうだ。

■おまけ〜DOOM3をMAX PAYNEみたいにプレイする方法!

 DOOM3はいうまでもなく1人称シューティングゲームだ。しかし,どうも,自分のキャラクターが見えないこのタイプは好きになれない……日本のゲーマーにはそんな人も少なくないようだ。
 DOOM3には実は3人称視点モードが隠されていて,本稿中に作成方法を紹介した「autoexec.cfg」に,
set pm_ThirdPerson "1"
を追記するだけでOK。
 これでゲーム中に主人公の後方上部にカメラが置かれた3人称視点でプレイできるようになる。
 といっても,なぜか照準が消えてしまい,ライフゲージなどのインジケーター表示も消えてしまうので,あくまでおまけモードなのだが,一度クリアした人ならば,別ゲームのように楽しめるので一度お試しあれ。

(トライゼット西川善司)
この設定を行うとDOOM3をこんな感じでプレイできる。もはや別のゲーム。とはいえビジュアル的にはこっちのほうがかっこいい。このモードもちゃんとプレイできるようにチューニングしてほしいと思うのは私だけ?

▲ 上に戻る