― 連載 ―

3DMark06の秘密 第2回「3DMark06で学ぶ影生成事情」

第1回へ

3DMarkの歴史は影生成方法の歴史でもある

 3Dゲームグラフィックスの進化において,重要なテーマの一つとなっているのが影生成だ。3DMarkシリーズは3Dゲームパフォーマンスを推し量ることを目的としたベンチマークソフトなので,その時代ごとの代表的な影生成技法を積極的に実装してきたという歴史がある。

●投射テクスチャマッピング

 少し振り返ってみると,「3DMark2001」では,“軽い”影生成技法であることから今なお採用例の多い「投射テクスチャマッピング」(Projected Texture Mapping)技法を採用していた。「投射テクスチャシャドウ」とも呼ばれるこれは,光源から見たキャラクターのシルエットを,光源位置から投射するようにテクスチャマッピングするという,原始的な方法だ(図A)。

 

 投射テクスチャマッピング自体はほとんどのグラフィックスチップでサポートされるため,互換性が高い。また,複数のキャラクターのシルエットを1枚のテクスチャにまとめてレンダリングして,一気にシーン全体へ投射テクスチャマッピングすることで効率よく影を作り出せる。

 

図A

投射テクスチャマッピングの概念図。プロジェクタで映像を投影するのと似たイメージだ

 

 ただしこの方法では,原理上“自分の影が自身に落ちる”ようなセルフシャドウ表現は無理。また,影をどこに落とすかという判定をマジメにやらないと,壁や天井をすり抜けて影が投射されてしまう。

 

投射テクスチャマッピングの代表例として「Half-Life 2」を見てみよう。この例では,光源は天井のほうにある。階上の敵の影が床をすり抜けて壁に投射されてしまっているのが分かるだろうか

●ステンシルシャドウボリューム

 「3DMark03」で採用されたのは,「DOOM 3」にも採用されて話題になった「ステンシルシャドウボリューム」(Stencil Shadow Volume)技法だ。この技法においてはまず,3Dオブジェクトの輪郭となる頂点を光源方向に引き延ばして「シャドウボリューム」(影領域)を生成。レンダリングするピクセルがこのシャドウボリュームの中にあるか(影となる),外にあるか(影とならない)を,視点位置からの深度情報(Zバッファ)と比較し,結果をステンシルバッファ(多目的に活用される算術処理専用のフレームバッファ)に記録する。そして,最終的にはこのステンシルバッファの内容に従って描画フレームに“影色ピクセル”を描画するのだ(図B)。

 

図B

ステンシルシャドウボリューム技法の概念図

 

 この手法ではシーン内の複雑な遮蔽構造に配慮した影生成を行えるため,セルフシャドウも問題なく処理できる。右の画像は,ステンシルシャドウボリューム技法による影生成の例だ。右側の光源から見て輪郭となる頂点を引き延ばして出来るシャドウボリュームを可視化しつつ,影色ピクセルを描画している。「盾」の影がセルフシャドウとして,本体に落ちているのが分かると思う。

 

 ただし,ステンシルシャドウボリューム技法では,すべてのシーン内3Dオブジェクトについて,影になろうがなるまいがお構いなしにシャドウボリューム生成を行うことになるので,フィルレート負荷が膨大になる。また,3DMark03もDOOM 3もそうだったが,当該3Dモデルの「どの頂点が輪郭として引き延ばされるのか」の判定をCPUで行う必要があるため,CPU負荷も相当なものだった。

 

DOOM 3における,あるシーンの影領域を強制的に可視化したものが右のワイヤーフレームだ。これらはすべて,生成された影領域。引き延ばされた頂点によって生まれた影領域が,シーン内に張り巡らされている

 

 さらに,頂点を引き延ばして出来るシャドウボリューム単位の影生成になることから,影形状は頂点単位になるので,影形状は見た目と異なるケースも出てしまう。例えば四角形のポリゴンに葉のテクスチャを貼っていたとしても,影は葉の形状にはならず,四角形となってしまうのだ。

 

2004年のE3における報道資料に収録された,「EverQuest II」β版のショット。β版ではステンシルシャドウボリューム技法を採用しており,奥のヤシの木の葉の影が四角くなってしまっている。ちなみに,これではマズいと判断されたのか,現在稼働中の製品版だと,木に影は落ちない

●パースペクティブ・シャドウマップ

 続く「3DMark05」で採用されたのは「シャドウマップ」(Shadow Maps)技法の改良版「パースペクティブ・シャドウマップ」(Perspective Shadow Maps,以下PSM)だ。

 

 ……と,いきなり改良版の話をしてもアレなので,まずはシャドウマップ技法について説明しよう。
 「デプスバッファシャドウ」(Depth Buffer Shadow)技法とも呼ばれるシャドウマップ技法は,ゲームでは「Tom Clancy’s Splinter Cell」で初めて採用されてから,関連技術の進化と,採用ゲームタイトルの増加が著しい。
 シャドウマップ技法では,まず初めに,光源を仮想視点としてシーンの深度情報のみをレンダリングする。これを「Zバッファレンダリング」(Z Buffer Rendering)というが,このZバッファレンダリングで「当該シーンの遮蔽構造を示すシャドウマップ」を作るところから始めるのだ。簡単に言えば「光源からの光が当たっているかどうか」を,シャドウマップ(用のバッファ)に書き込み,最終的なシーンのレンダリング時には,このシャドウマップを参照して,「光が当たっていない(=遮蔽されている)なら影になる」といった具合に判定しながら描画していくのである(図C)。

 

図C

シャドウマップ技法の概念図。2段階でシーンを描画していくようになっており,まず最初にシャドウマップを生成する。シャドウマップには,シーン内のオブジェクトに対して「光が当たっている部分までの距離(深度情報)」が記載される。続く,最終的なシーンのレンダリングでは、レンダリングするピクセル1個1個について,その位置に対応するシャドウマップの内容を参照。論理的に光の当たっているところなのか,そうでないのかを判定して描画していく

 

 シーン内の複雑な遮蔽構造に配慮できるから,シャドウマップ技法なら,セルフシャドウ表現が可能だ。シャドウマップ生成時にテクスチャの内容も吟味するようにすれば,頂点単位よりも細かな,テクスチャの内容に配慮した,複雑な形状の影まで表現できる。

 


シャドウマップ技法を採用する「Tom Clancy’s Splinter Cell」では,ステンシルシャドウボリューム技法とは異なり,テクスチャに描かれた葉の形で影が落ちている

 ただしシャドウマップ技法には,「シャドウマップのサイズ(解像度)が十分でないと,影の生成精度がとたんに落ちてしまう」という弱点もある。例えば100m×100mからなる領域の影を256×256テクセルのシャドウマップで表したとしよう。すると,(100m÷256テクセル)で,約40cm×40cmの領域の遮蔽構造を,わずか1×1テクセルで表現しなくてはならなくなる。要するに,ある程度狭い,屋内のようなシーンならまだしも,屋外などの広い空間では,大容量のシャドウマップを生成しなければ,影の品質がとたんに悪くなってしまうのだ。

 

 これを改善するのが,先ほど「改良版」と述べた「パースペクティブ・シャドウマップ」(Perspective Shadow Maps,以下PSM)技法である。

 

 従来のシャドウマップ技法では光源基準で普通に行っていたシャドウマップ生成を,PSMでは最終的なレンダリングを行うカメラ視点に近い領域のシャドウマップを高解像度に,遠い領域のシャドウマップを低解像度に行うという,いわばバイアスをかけて生成する工夫を盛り込んだのだ。これは光源位置からのシャドウマップ生成を,透視投影変換した座標系で行うことで実現する。

 

シャドウマップ技法を用いると,影に強いジャギーが出てしまっているのが分かる。下はこのときのシャドウマップを可視化したものだが,広いシーン全体の遮蔽構造をこの1枚のシャドウマップに記録しようとした結果,情報量は少ない感じで,これが上のジャギーにつながっている
一方,PSMを用いたものがこちら。まず,上の画面で左と見比べてみてほしいが,影のジャギーが劇的に改善されている。可視化したシャドウマップを見てみると,そもそもマップの並びが異なっており,視界に近い位置のキャラクターの遮蔽構造が,より高精度で記録されているのがよく分かる

 

3DMark06の影生成技法はジョン・カーマック推奨の
カスケード・シャドウマップ

 では「3DMark06」ならどうかというと,3DMark05とは別の改良版シャドウマップ技法である「カスケード・シャドウマップ」(Cascaded Shadow Maps,以下CSM)技法を採用する。
 CSM技法は,2004年に開催されたQuakeシリーズの公式ファンイベント「QuakeCon 2004」の基調講演で,id Softwareのカリスマ3Dプログラマ,John Carmack(ジョン・カーマック)氏が「PSM技法よりもゲーム向き」と述べたことで,(肯定/否定はともかく)話題となった。また,業界関係者の間では「id Softwareの次世代3DゲームエンジンはCSM技法を採用する」とも囁かれている。

 

 では,CSMとはどんな技法なのかというと,カメラ(視点)の視線方向と,影生成元となる光源方向との位置関係を吟味し,視界の奥行き(Z)方向に対して多段階の縦つなぎ(カスケード)構造の“遠近レベル”を動的に設定する。そして,それぞれの段階に対して,個別のシャドウマップを生成するのである(図D)。

 

図D

CSMの概念図。John Carmack氏はQuakeCon 2004の基調講演で「CSMはシャドウマップのミップマップ(MIP-MAP)みたいなものかな」とたとえていた。ただ,テクスチャのミップマップとは異なり,各レベルのシャドウマップで解像度は変わっていない。ここは今後,工夫のしどころがありそうな気がする

 

 CSMでは近場から遠方までのすべてを高解像度(=高精細)のシャドウマップでカバーすることにより,全域で高解像度の影を得ようというというアプローチなのだ。グラフィックスチップのパワーにモノをいわせた,かなりゴリ押し的な手法といえる。
 ちなみに,3DMark06においては,遠近の各段階のシャドウマップは,ごく普通のシャドウマップで生成されるとのこと。また,縦つなぎの遠近レベルは5段階に設定されており,それぞれの段階におけるシャドウマップは2048×2048テクセル解像度で生成されているという。つまり,シャドウマップは5回生成されることになるわけだ。

 

「2048×2048ドット」ということ。テクスチャの画素は慣例的にテクセルで表現される

 

 なお,シャドウマップには(デフォルトでは)GeForceシリーズだと24bit深度バッファ(D24X8)が,Radeon X850以下とRadeon X1800では単項の32bit浮動小数点テクスチャ(R32F)が,Radeon X1800以外のRadeon X1000シリーズでは24bit深度バッファ(DF24)が採用されるようだ。
 なぜこのように異なるのかといえば,GeForceではシャドウマップ参照時に「NVIDIA SHADOW」機能(後述)を使用するのに対し,Radeon X1800以外のRadeon X1000シリーズでは,これも後述するが,「Fetch4」を利用するため。特殊機能を何も利用できないときにはR32Fが利用されることになる。

 

 1枚のシャドウマップは2048×2048テクセル×32bit=16MBのグラフィックスメモリを消費する計算になる。影生成に当たっては,1光源当たり,この1枚の16MBのシャドウマップを5回分再利用する形になっているという。

 

 ちなみに,3DMark05のPSM技法では2段階の遠近レベルを設定して2回のシャドウマップ生成を行っていた。3DMark05も2048×2048テクセル解像度のバッファを再利用する形だったので,シャドウマップ1枚当たりのグラフィックスメモリ消費量自体は変わっていない。ただ,単位時間あたりにレンダリングしなければならないシャドウマップ枚数が2枚から5枚になったことで,フィルレート負荷的には3DMark06のほうが2.5倍高くなったことになる。

 

3DMark05より。右は影の部分をアップにしたもの。影のエッジに毛羽立ち状のジャギーが見えている

 

3DMark06のCanyon Flightは,3DMark05とはカメラ位置とカット割りが微妙に異なるため,同一フレームではないが,それでも,アップにすると,3DMark05で目立っていた影エッジが大幅に低減されているのが分かると思う

点光源からの影生成には
全方位シャドウマップ技法を使用

 CSMは,どのオブジェクトに対しても同一方向から平行に光が降り注ぐ「平行光源」からの影生成に活用されている。これに対して,全方位を照らす点光源からの影については6面のキューブマップ形状のシャドウマップを生成して影生成を行う「全方位シャドウマップ」(Omnidirectional Shadow Mapping,以下OSM)技法が,3DMark06では用いられている。

 


Return to Proxycon終盤の1コマ。壁の回転灯によって生成される影はOSMによるものだ。“生”のシャドウマップなので,壁に投射されている影はよく見るとジャギーがかなり目立っている

 イメージとしてはシャドウマップ技法による影生成を6面の全方位に拡張したようなものだ。なお,これはEpic Gamesの「Unreal Engine 3.0」に採用されている技法でもある。

 

 3DMark05でもOSMは実装されていたが,3DMark06では,この6面体シャドウマップの解像度が高解像度化されている。3DMark05では512×512テクセルの6面体(キューブ)マップだったのが,3DMark06では1024×1024テクセルのマップとなっているのだ。占有容量的には,3DMark05の16MB(512×512テクセル×32bit×6面)に対して,3DMark06では24MB(1024×1024テクセル×32bit×6面)となる。

 

 平行光源のCSMと同様に,OSMでもシャドウマップにはGeForceシリーズだと24bit深度バッファ(D24X8)が,Radeon X850以下とRadeon X1800では単項の32ビット浮動小数点テクスチャ(R32F)が,そしてRadeon X1800以外のRadeon X1000シリーズでは24bit深度バッファ(DF24)が採用される。
 OSMのシャドウマップ生成に当たって,CSM的なカスケード構造や透視投影変換によるPSM的なバイアスは掛かっていない。OSMのCSM化はグラフィックスメモリの使用量として実装に無理があるので実装しなかったのだろう。3DMark06の点光源は基本的には近場しか照らさないのでのでOSMのPSM化は不要と判断したようだ。

 

2匹の蛍の光から,二つのセルフシャドウが木々に生まれている。同時に,下方の草木にも影が生成されており,全方位に影が生成されるOSMならではの効果を確認可能だ 緑の蛍と紫の蛍はそれぞれ動的な点光源として設定されており,それぞれがOSMによる影を生み出す。虫の脚を見ると,影が2種類生成されているのが分かるだろう

3DMark06のソフトシャドウ

 と,ここまで長々と説明してきたが,見た目という意味で,最も大きな変化を遂げたのは,「HDR/SM3.0 Graphics Test」における「影の描画のされ方」だ。水棲怪物のシーン「Canyon Flight」で,影の輪郭が非常に柔らかくなり,いわゆる「ソフトシャドウ」になったことは,気づいた人も多いと思う。対義語となる「ハードシャドウ」との違いは,下の図Eにまとめてみた。

 

図E

ハードシャドウとソフトシャドウの違いはこんな感じだ

 


SM3.0でサポートされているピクセルシェーダの動的条件分岐を効果的に活用してソフトシャドウを生成――。その第1号的作品がTom Clancy’s Splinter Cell: Chaos Theoryだ

 HDR/SM3.0 Graphics Testにおけるソフトシャドウ生成においては,SM3.0で追加されたピクセルシェーダの動的条件分岐命令を駆使し,影の輪郭付近にのみ選択式に1ピクセル描画につき16テクセルものシャドウマップ参照を行ってぼやけ処理を適用している。
 16サンプルというのは,フィルタ処理としてかなり重い処理の部類だが,この程度の手法はすでに前出のTom Clancy’s Splinter Cell: Chaos Theoryなど,実際のゲームで実装されているから,そんなに非現実的な手法でもない。

 

左が3DMark05,右が3DMark06の画面だ。3DMark05はPSMによる影だが,輪郭がはっきりしすぎている。これに対して3DMark06では,CSMによって生成された影に対し,影のエッジ付近に対して16サンプルのフィルタリング処理でぼやかすことでソフトシャドウ表現を実現。方法自体はTom Clancy’s Splinter Cell: Chaos Theoryとまったく同じ

 

 では,SM2.0世代のテストではどうかというと,これらでは簡単なソフトシャドウ処理が適用される。

 

 デフォルト設定だと,GeForceシリーズではシャドウマップに24bit深度バッファ(D24X8)が採用される。そして,シャドウマップ参照時にNVIDIA SHADOWを利用したバイリニアフィルタリングが適用され,やや柔らかめな影を得られるようになっている。
 NVIDIA SHADOWの概要については,NVIDIAによる説明のスライドが分かりやすいので下に挙げてみた。通常のシャドウマップ参照では黒か白の二値的な結果しか得られない(スライド上段)。これに対して,NVIDIA SHADOWでは周辺4テクセルの状態を読み込み,その平均値を求めてこれを結果として返す。これは四点近傍フィルタ処理(Percent Closer Filtering)に相当するのだが,なんとテクスチャ読み込みユニットがペナルティなしで自動的に行ってくれるのだ。

 

NVIDIA SHADOWの仕組み。GeForceシリーズの強みはここにあった

 

3DMark05で比較してみた。左がNVIDIA SHADOW無効時,右が有効時だ。影のジャギーが心持ち柔らかになっているのが分かるだろうか

 

 これに対してRadeonシリーズでは,Radeon X1800以外のRadeon X1000シリーズでシャドウマップに24bit深度バッファ(DF24)が採用されている。そして,そのシャドウマップ参照時には1要素テクスチャに対して1回のテクスチャ参照で周辺4テクセルのサンプルを実行できる「Fetch4」が利用される。Fetch4で読み込んだテクセルはシェーダプログラム側で平均値を計算(実質的にはバイリニアフィルタ処理に相当)してから利用すれば,NVIDIA SHADOW機能と同等のやわらかい影が得られるというわけだ。

 

Radeon X1900に関する本連載バックナンバーから再掲。Radeon X1800以外のRadeon X1000シリーズでは,NVIDIA SHADOWに似た,Fetch4というテクスチャ参照方式が実装されている

 

GeForce 7800 GTXのNVIDIA SHADOW有効時(左)と,Radeon X1900 XTのFetch4有効時(右)。結果に大きな違いは認められない。苦節5年,ついに格差は是正された!?

 


3DMark06のImage Qualityテストオプションより。Radeon X1800では,ハードウェアシャドウマップ機能(=Fetch4)を選択できないため,ハードウェアシャドウマッピングを無効にするオプション「Disable HW shadow mapping」が,グレーアウトして選択できなくなっている。もちろんこの項目は,Radeon X1900やRadeon X1600なら選択可能だ

 Fetch4については,本連載でRadeon X1900の解説を行った回でも触れているように,Radeon X1900の新機能として紹介されたフィーチャーだ。しかし,実際にはRadeon X1600/X1300でもFetch4はサポート済み。Radeon X1800だけ未対応なのだ。
 Radeon X1800シリーズは(一応)Radeon X1000シリーズのハイエンドなのに,DF24とFetch4に対応していないのが少々不思議である。この理由は,Fetch4はXbox 360(Xbox 360のグラフィックスチップはATI製)における初代Xboxソフト(XboxのグラフィックスチップはNVIDIA製)との互換性を保つために開発された機能で,Radeon X1800のリリースタイミングには間に合わなかったからと推測されている。

 

 といったところで,整理してみよう。Radeon X1800以外のRadeon X1000シリーズでは,DF24バッファ内のシャドウマップに対してFetch4を実行できる。バイリニアフィルタリングに相当するこのFetch4で平均値を求め,ソフトシャドウを生成しているということになる。余談だが,ATIが素直にハードウェアシャドウマップ機能を実装してこないのは,この機能の特許をNVIDIAに押さえられているため。

 


Radeon X1900 XTで,強制的にR32Fを使ってみた。画面自体はまったく同じ(だが,レンダリング負荷は高くなる)

 

 Radeon X850以下とRadeon X1800ではデフォルトで,シャドウマップに単項の32bit浮動小数点テクスチャ(R32F)が利用され,4点のシャドウマップ参照を行って平均値を取るソフトシャドウを生成する。4回の独立したテクスチャ参照を行うことになるのでパフォーマンスへのマイナス効果は大きいが,得られる効果自体は同じだ。

 

 つまり,SM2.0 Graphics Testでは,レンダリング結果こそほぼ同じものが得られるが,グラフィックスチップによって,まったく異なるソフトシャドウパス(≒ソフトシャドウ生成手段)が実行されることになる。「同一処理を行って,どのグラフィックスチップが最高速なのかを推し量るのがベンチマークソフトである」という見地からすると,この設計は奇妙だ。
 この点Futuremarkは「実際の3Dゲームもグラフィックスチップによってソフトシャドウパスを切り替えるような設計を採用しているモノが大半。よって,最新3Dゲーム環境の性能評価というコンセプトからすれば,この方針は間違っていない」との主張を行っている。どうしても同一のレンダリングパスでテストを行いたいなら,「Benchmark Settings」から「Disable HW shadow mapping」をチェックすれば,NVIDIA SHADOWもFetch4も無効になり,バイリニアフィルタなしのR32Fシャドウマップのソフトシャドウメソッドが利用されるようになるから,それをどうぞ,というわけである。

 

 まぁ,実際に得られる映像が同品質であれば効率の良いメソッドを採択するのは理にかなっているので,アーキテクチャレベルでの優劣を比較したいという向き“以外では”この動作に問題はないとは思う。

 

 というわけで,今回は徹底的に,3DMark06と,影生成の現在について掘り下げてみた。いよいよ次回からは,3DMark06のテクスチャ,フォグ,光散乱シミュレーション等の解説を行いつつ,「各テストで何を計測しているのか」という核心に迫っていく。(トライゼット 西川善司)

 

第1回へ

 

タイトル 3DMark06
開発元 Futuremark 発売元 Futuremark
発売日 2006/01/18 価格 19.95ドル(Advanced版)
 
動作環境 OS:Windows XP(+DirectX 9.0c December 2005 Update),CPU:Pentium 4/2.50GHzまたはAthlon XP 2500+以上,メインメモリ:1GB以上,グラフィックスチップ:シェーダモデル2.0対応以上,グラフィックスメモリ:256MB以上,HDD空き容量:1.5GB以上

COPTRIGHT(C)2006 FUTUREMARK CORPORATION

【この記事へのリンクはこちら】

http://www.4gamer.net/specials/3de/3dmark06/002/3dmark06_02.shtml