― 連載 ―

3DMark06の秘密 第3回「スコアの正体」

前へ    

HDR/SM3.0 Graphics Test 1(SM3 GT1)
Canyon Flight

 渓谷に住む水棲怪物が飛行船に襲いかかるも,この攻撃をなんとかかわし,非常エンジンに点火して脱出を試みる。このシーンも3DMark05からの持ち越しだ。もちろん,3DMark05とまったく同じではなく,やはり3DMark06の新しい3Dエンジンで動作している。また,このテストで用いられるシェーダプログラムはSM3.0ベースとなり,さらにHDRレンダリングは,SM3.0世代のグラフィックスチップでサポートされるHDRレンダリング支援機能をフル活用するようになっている。

 

3DMark05(左)と3DMark06(右)で比較してみると,相違点は意外と多い。崖の上の木々,太陽のグレア,レンズフレア,崖の水面下にある情景の有無,さざ波表現の法線マップ解像度,ジオメトリレベルの波の凹凸などなど……

 

 Canyon FlightもSM2.0 Graphics Test 2のFireFly Forestと同じ屋外シーンだが,こちらは視点がより広範囲の3D世界を捉えるようになっており,フライトシミュレータのような,壮大なスケールの情景をそのままに描き出す「エピックスケール」(Epic Scale)描写を行うゲームを想定したシーンといえるだろう。

 

 第1回で説明したように,Canyon Flightで,HDRレンダリングはFP16-64ビットバッファに対して行われている。さらに,映り込み表現などに用いる動的な環境マップテクスチャにもFP16-64ビットテクスチャが用いられているのだ。水面に映りこんだ情景までもがHDRのライトブルーム(光の溢れ出し)を起こしているのは,その成果である。

 

水面に映り込んだ太陽がグレア(極度に輝度の高いものが視野内に存在することで,ほかの部分が見えにくくなること)を起こしている。もちろん,一般的なLDR(Low Dynamic Range)テクスチャでも,LDRテクスチャのαチャネル部に強輝度情報をメモしておくというトリックで,こうした表現を実現する方法はあるが,3DMark06では一貫したHDRバッファ&HDRテクスチャでHDRレンダリングを実行しているのだ

 

●波の表現が一歩進んだ3DMark06

 水面の表現も,3DMark05より若干進んだものになっている。
 「若干」なので,同じ部分も多い。まずはそこから説明しておこう。まず,さざ波表現は3DMark05と同じ,法線マップによる環境バンプマッピングで実現されている。この環境バンプマッピングの発展形によって実現されているさざ波シェーダは,かなり高度かつ複雑。細かい凹凸に周囲の情景が映り込む情景反射だけでなく,さらには水面下の情景が歪んで見える簡易的な屈折表現も同時に実現されている。

 

3DMark05(左)と3DMark06(右)の比較。屈折表現による水面下の様子の見え方は同じだ。なお,水棲怪物の色が違うのは,3DMark06で配色が変更されたから

 

左側の近場の崖は,水面下に沈んだ部分まで見えるが,奥の方の水面では崖の鏡像しか見えない。これがフレネル反射の表現

 さらに,この情景反射と屈折の混ざり具合を,視線と水面がなす角度に応じて変化させるフレネル反射も同時に実現しているのも,3DMark05から変わっていない。
 なお,フレネル反射とは「視点から距離の遠い,水面に対して視線角度が浅い領域ほど周囲の映り込みが強くなる。一方,視点から距離が近く,視線角度が大きい領域ほど水面下の屈折情景が強く見える」異方性反射モデルのことだ。

 

 では,何が進化したのか。
 3DMark06ではこれに加え,頂点単位の波動シミュレーションを行い,ジオメトリレベルで(=3D形状として)水面に凹凸が作られる,大局的な波の効果も加えている。波動シミュレーションには「水深の深い大洋の波に適している」といわれる「ゲルストナー波動関数」(Gerstner Wave)を用いて内部的に四つの波を生成している。ほぼ平行に並んで動いている太めの指向性のある波がその効果だ。なお,このテストはVTFを利用していないので,波動シミュレーションは自体はCPUで行っていると推察される。

 

さざ波表現だけでなく,実際のジオメトリレベルで凹凸のある波の表現が追加された。この画面でいうと横棒状に見える起伏の波がそれ

 さざ波のアニメーションは,2枚のさざ波の凹凸を表現した法線マップを重ねてスクロールさせるもので,非常に機械的で規則性のある不自然な波になる。3DMark05の水面表現はここまでだったわけだが,3DMark06ではこのジオメトリレベルの波動アニメーションが加わったことでこの規則性が露呈しづらくなっている。

 

 また,水の透明度が低い様子や水面下を泳ぐ水棲怪物が沈み込んでいる様子を表現するために,3DMark05と同じく「深度フォグ」(Depth Fog)処理を適用しているのも,3DMark06の特徴だ。

 

水面から深くなるにつれて沈んで見える表現は,深度バッファを活用しての自前のフォグシェーダによるものだ

 一般に「深度フォグ」というと,グラフィックスチップの標準的なフォグ機能を連想してしまいがちだが,Futuremarkが公開しているホワイトペーパーによれば,3DMark06(および3Dmark05)の深度フォグは1要素の32ビット浮動小数点(FP)深度バッファを利用して生成しているという。一般的なグラフィックスチップの深度フォグでも表現的には必要十分と思われるが,水面位置からの深度に比例したキッチリとした沈み込みを表現したいために,このような手法を採用したと思われる。
 なお,実際の処理系としては視線から遠ければ遠いほど透明度を下げていくことになる。

●CSMとソフトシャドウで生まれ変わった影表現

 屋外の晴天シーンということもあり,光源は太陽として設定されたHDRの平行光源のみ。そしてこれが屋外の全域の影生成元になる。3DMark05ではキザギザしていた断崖絶壁上の影も,3DMark06では第2回で説明したCSM技法とソフトシャドウ効果の恩恵にあずかり,非常な柔らかなものに生まれ変わっているのが印象的だ。

 

3DMark05(左)と3DMark06(右)で,ジャギーの出方を比較してみた。飛行船のエンジンの影に注目すると,左で確認できる強いジャギーが,右にはないのが分かる

 

これも左が3DMark05で右が3DMark06。砲身の影や背景の崖の影が3DMark06では柔らかなソフトシャドウ表現になっている

 

 Canyon Flightにおける空や遠方の霞は,SM2.0 Graphics Test 2でも使われた光散乱シミュレーションによるものだ。
 SM2.0 Graphics Test 2のところでも出てきたこの光散乱シミュレーション,ただ名前を聞くとなにやら難しく聞こえるが,3DMark06で採用されているのは,最近,いくつかの3Dゲームでも実装されるようになってきているイメージベース(画像処理系)のポスト処理による近似手法だ。

 

 この手法では,シーンをレンダリングした際に結果として残るZバッファの内容を利用する。Zバッファは重複描画を避けるためにレンダリング時に描画成功した画素に対応する深度情報を記録するためのバッファだが,シーンのレンダリングを終えたZバッファには「そのシーンの奥行きがどれくらい開けているか」に相当する情報がピクセル単位で記録されている。

 

Zバッファには,描画するピクセルに1対1に対応する深度情報が記録されていく。本来は視点から見えない情景を反復描画させないためのメモ書き的に活用される。実際のシーンの描画は行わず,この深度情報だけをレンダリングすることをZバッファレンダリングといい,シャドウマップ技法の影生成におけるシャドウマップ生成は,光源位置を視点にしたZバッファレンダリングと等価といえる

 

こうした空気遠近法は,グラフィックスチップ標準のフォグでは表現できない

 光は空気中を長い距離進めば進むほど散乱したり減衰したりするわけだが,この距離情報をZバッファの内容で代行し,これをタネにしてどう光が散乱/減衰するかを計算して画像を加工していくのだ。こうした処理系によって奥行き方向がぼやけたり,柔らかい光に満ちあふれたりするようになり,シーン内に配置された3Dオブジェクトの複雑な前後関係や遮蔽関係とつじつまの合う,空気遠近の霧になる。
 遠方の断崖が淡くよどんでいるが,単純に霧に沈むのではなく柔らかい光に霞んで見える――。こういった表現が可能になっているのは,この仕組みによるところが大きい。

 

 また,水面付近の“もや”のようなものは「異類混交フォグ」(Heterogeneous Fog)というテクニックで表現しているという。
 異類混交フォグ,ヘテロジーニアス・フォグという名前で尻込みしてしまいそうだが,ホワイトペーパーの解説を読む限りでは,単純なボリュームレンダリングによる霧の表現のようだ。ボリュームレンダリングとは,CTスキャンのような輪切りにしたテクスチャから,実際に視点方向から見たときの立体物としての映像を再構成してやるレンダリング技法のこと。この例では,霧の密度を白黒の明暗で表した輪切りテクスチャを用意していると思われる(ホワイトペーパーにそこまでの解説はない)。

 

異類混交フォグによる,水面付近に立ちこめる水蒸気の表現。この異類混交フォグは後述のSM3.0 Graphics Test 2の雪煙の表現にも利用されている

 医療や設計業務などのボリュームレンダリングでは,高解像度でしかも膨大な数の輪切りテクスチャ(ボリュームテクスチャ)を生成し,実際のレンダリング時も輪切りテクスチャと視線との交叉点を多く取って描画していかなければ中抜けした変な映像になってしまう。しかし,この場面ではもやの濃淡がそれっぽく見えればいいので,かなり大ざっぱなものを実装しているようだ。資料によれば,実際の1画素をレンダリングするにあたり,輪切りテクスチャへのサンプリングはたかだか5点とのこと。ただし,この霧は広範囲に分布しているので負荷はそれなりにありそうだ。この表現のためのピクセルシェーダプログラムの命令比率は(算術命令:テクスチャ命令)=(20:1)で,テクスチャユニットよりもピクセルシェーダのほうに多くの負荷がかかると説明されている。

●色が変わっただけではない水棲怪物

 最後に怪物の材質シェーダについても触れておこう。Canyon Flightの主役キャラである水棲怪物は,色が変わったところに目が行ってしまうが,実はそれだけではない。毒々しくもプリプリっとした半透明の肉感を表現するために,擬似的な表面下散乱(Subdurface Scattering)を実装しているのだ。
 表面下散乱とは,光がその材質の中を伝って出てくる現象をいい,身近なところでは光にかざした手のひらが鈍く光ったりするあれだ。半透明材質であることを表現するのに適しているほか,人肌の表現にも有用であるとして3Dグラフィックスの研究テーマとしては最近盛んになっている。

 

光源から対象物の裏面までの距離をバッファにレンダリングして,視点(カメラ)からは対象物の正面までの距離を同じくレンダリング。これの差分を求めれば対象物の厚みがバッファに残るというカラクリだ

 3DMark06では,NVIDIAがGeForce 7800 GTX用に用意したデモ「Luna」でも実装されていた,光散乱と同種の疑似的な手法が用いられている。
 まず,光散乱を行う対象物(このシーンでは怪物)の光源からの深度情報と視点(カメラ)からの深度情報をZバッファレンダリングで求める。これにより視点から見た対象物の厚みを算出。続いて視線方向と,その対象物を構成している面(ピクセル)の法線方向と,先ほど求めた厚みから,どのくらい光が漏れてくるかを近似的に算出している。本来はレイトレーシング的な手法を用いなければならない光散乱シミュレーションだが,この大胆なマルチパスレンダリング手法による近似でもそれっぽく見えるので,効果としては大きい。

 

NVIDIAのデモ「Luna」に登場した半透明モンスター「fishboys」。この疑似表面下散乱表現と同種のものが3DMark06に実装された 疑似表面下散乱により,水棲怪物が持つ,半透明の肉感がよく表れている

 

ほぼ同一のシーンで3DMark05(左)と比較してみた。3DMark05だと硬い質感の水棲怪物だが,3DMark06(右)だと,ゼリーっぽい,柔らかな感じになっている

HDR/SM3.0 Graphics Test 2(SM3 GT2)
Deep Freeze

 廃棄された無人の南極基地をカメラが巡回していくこのシーンは,3DMark06で追加された完全新作。アクティブに動き回るキャラクターが存在しないので,ほかのシーンと比べると見た目は地味だが,興味深いテクノロジーがいくつか活用されている。

 

 晴天の屋外シーンということで,Canyon Flightと同じく,太陽に相当する平行光源がHDR光源として設定されている。影生成はもちろんCSM技法によるものだ。このシーンでも当然,FP16-64ビットバッファを駆使したHDRレンダリングが用いられる。
 ホワイトペーパーによれば,Deep Freezeの平均輝度値は,LDRレンダリングで記録できる最大1.0を大きく超える11.0だそうで,それでいて輝度1.0以下の領域も多いため,「HDRレンダリングでなければ実現できなかったシーンだ」(Futuremark)とのこと。

 

 太陽が沈んでいくにつれて,影が視点方向に長く伸びてくるが,この影にギザギザ感はない。シャドウマップ系の技法としてはかなりのワーストケースといえる状況なのだが,ここまで違和感のない影が出来ているのはCSM技法と16サンプルのソフトシャドウ処理の恩恵だ。

 

遠くのものの影が手前に伸びてくるというのはシャドウマップ技法が最も苦手とするもの。得てして毛羽立ちやジャギーといった破綻が生じるのだが,3DMark06ではCSM技法のチカラワザによって破綻がなくなっている

 

川瀬正樹氏のWebサイトで公開されているHDRデモより。このデモでは,森林の写真テクスチャの明るい部分をHDR光源として取り扱い,イメージベースド・ライティングを行っている

 また,この太陽が沈んでいく流れの中において,シーン内の全オブジェクトに対し,つじつまの合う淡い環境光に満ちあふれているような陰影処理が行われているように見える。これは,拡散反射と鏡面反射用それぞれ用に用意した2組のキューブマップを太陽の位置に応じてブレンドして「イメージベースド・ライティング」(Image Based Lighting)を行った効果という。
 イメージベースド・ライティングとは,テクスチャを画像ではなく,光の分布として解釈し,ピクセルシェーダユニットでピクセル単位の光源処理を行うテクニックだ。これをうまく使うと,相互反射までを考慮したような自然な環境光表現が作り出せる。

 

太陽の高さによる環境光の違い。雪や建物を包む環境光が天球の空や太陽の色分布とマッチした感じになっている

 

 Deep Freezeにおいても,空やフォグは光散乱のシミュレーションを行って自動生成されている。
 光の散乱は空気中の分子によって均一に散乱する「レイリー散乱」(Rayleigh Scattering)と,分子よりもやや大きい塵によって指向性をもって散乱する「ミー散乱」(Mie Scattering)がある。この二つについては,さすがに専門的すぎるので解説しないが,Deep Freezeにおける空のテクスチャは,こうした散乱モデルを模式化して「天空のあの位置に太陽が来ると空はどうなる,太陽はどう見える」という方程式を解くことで自動生成しているのだ。Futuremarkのデザイナーがペイントしたテクスチャではなく,計算で算出された(=プロシージャル生成された)空やフォグなのである。

 

太陽の位置によって変わる空の色は,光散乱シミュレーションによるプロシージャル生成

 

 雪の表現もやはり地味だが,自然に見えるための工夫がいろいろと盛り込まれている。基本は前述したBlinn-Phongの鏡面反射モデルを利用しているが,細かな凹凸表現には2枚の法線マップによるバンプマッピングが行われているのが特徴だ。
 また,分かりにくいが,雪のコブなどから向こう側の光が透き通って見える表現も盛り込まれている。なお,ホワイトペーパーによれば,これは前述した擬似的な表面下散乱で実現しているという。

 

雪の上の細かい凹凸は,法線マップによるバンプマッピングの効果だ 表面下散乱が使われているとのことだが,ちょっと(かなり?)分かりづらい

 

 さて,霧はCanyon Flightのところで解説した光散乱シミュレーションによるもの。視点のすぐ前を吹きすさぶ雪については一般的な吹雪模様を描いたテクスチャをパーティクルとしてシーン内にちりばめている。

 

 ただ,これらとは別に,雪原の表面を這うように流れ舞う雪の表現があることに気がついただろうか。これは,降ったばかりの雪が風にあおられて,雪原の低い位置を流れていく様子を表現している。
 単純な高さに依存した霧というのは,グラフィックスチップ標準のフォグ機能を使って,シェーダプログラムで小細工すれば簡単にできるのだが,濃淡の違う霧が動くような表現を行うには別のテクニックが必要になる。3DMark06ではCanyon Flightのところで説明した異類混交フォグで表現しているとのことだ。

 

静止画だと分かりにくいが,雪面の低い位置を雪煙が吹きすさぶ表現が見て取れる。これが異類混交フォグによる表現だ

CPU Test 1&2
Red Valley(snap258.bmp)

 ついに3DMarkスコア換算に含まれることとなったCPU性能。3DMark06のCPU Testは3Dグラフィックス支援性能ではなく,マルチスレッド性能の計測に重きを置いた設計になっている。
 テストは,迷路状のマップ内を徘徊する合計87機のスピーダーバイクとホバリングタンクがそれぞれのAIを働かせて戦うという,Botによるゲームライクなものだ。

 

CPU Testで用いられるシーンのマップ全体像

 スピーダーバイクのAIはマップの最奥にある要塞への到達を目指し,一方,ホバリングタンクのAIはスピーダーバイクの接近を阻止するために移動し,射程に入ったスピーダーバイクに砲撃を浴びせるようになっている。スピーダーバイクはホバリングタンクに遭遇しないように,そしてなおかつスピーダーバイク同士,衝突しないように行動する。
 このCPU Testは,純粋なCPU性能を測定する目的から,描画にまつわるオーバーヘッドを最低限にするために640×480ドットの低解像度画面で,なおかつ2fps固定で実行される。よって実行時,紙芝居状態になるのは,別に読者のPCのCPUやグラフィックスカードが遅いためではない。この点は誤解している人が多いようなので,改めて注意を促しておきたいと思う。

 

 さて,CPU TestにおけるCPUの主なタスクは大きく分けて3種類となる。
 まず一つめは,全体を司るゲームループだ。グラフィックス描画のためのデータを揃えてグラフィックスチップに渡したり,残る二つのタスクとゲーム進行の同期を取る作業などを担当している。いわばゲーム進行の指揮者的なタスクである。

 

衝突判定はリアルタイム性が要求されるため,ゲームループ側で実行される。逆にいうと,それ以外の物理処理は独立したスレッドとして実行され,ゲームループとは20msサイクルで同期するようになっている

 二つめは,物理エンジンのタスクだ。具体的には,87機のゲーム内ユニットとゲーム世界との相互干渉を剛体物理シミュレーションで処理しているタスクで,最近何かと話題の多いAGEIA TechnologiesのPhysXライブラリ(旧NovodeX)を使用している。これは独立したスレッドとして動作しており,ゲームループと,20msサイクルで同期する。
 60分の1秒単位のような毎フレーム同期にしないのは,物理処理を描画サイクルよりゆっくりにしてもそれほど違和感がないという単純な理由から。実際の3Dゲームでもそういう実装になっていることが多い。ただし,衝突判定などのリアルタイム性が重視される物理処理系は,先ほど紹介したメインのゲームループ内に組み込まれており,毎ループ単位で処理される。

 

 三つめはAIのタスクで,ゲーム内の各ユニットが迷路内をどう動けばいいか,行動方針を決めている。各ユニットはほかのユニットを障害物と認識し,ある決められた範囲内におけるほかのユニットの動きや,これまでの移動経路に配慮した行動方針を算出しているのだ。なお,AIの経路探索アルゴリズムには,南カリフォルニア大学 Sven Koenig(スヴェン・コーニグ)氏の「D*」を使用しているとのこと。
 このAIタスクも,独立した複数のスレッドとして処理される。デュアルコアCPUやデュアルCPU,Hyper-Threadingテクノロジ対応CPUなど,物理/論理問わず,CPUが複数認識されたとき,このAIスレッドは多めに生成されるとのことだが,詳しいスレッド数についての説明は行われていない。

 

 AIスレッドもやはりメインのゲームループとの同期を取るが,そのサイクルは物理エンジンの同期サイクルよりもさらに間隔を開けた200〜600ms。AIによる思考の変化は,描画サイクルや物理サイクルよりも大まかになるということだ。
 ちなみにこれも,実際の3Dゲームでよく採られるアプローチである。これは,AIの決断した戦略が,たかだか数フレーム内で実行を中断され,次の思考に切り換わってしまっては意味がないためだ。

 

AIは,数百msという粒度の粗い同期サイクルのマルチスレッドとして実装されている。まぁ,どんなに頭の回転の早い人でも1/60秒単位で思考を切り換える人がいないことを考えれば,納得のいく実装だろう

 

 テスト自体は同じCPU Test 1と2だが,違いはAIの思考レベルと,思考した結果を同期するサイクルの長短だ。CPU Test 1は思考レベルが高く,AIの同期サイクルは短くなっており,CPU Test 2はその逆で思考レベルが低く,同期サイクルは長くなっている。どうやらCPU Test 2の方が負荷は低そうだ。

 

 

 以上,3DMark06の総合スコアを左右するテスト群について説明してきた。解説最終回となる次回は項目テスト(Feature Tests)と設定オプションについて解説していきたい。(トライゼット 西川善司)

 

前へ    

 

タイトル 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/003/3dmark06_03_02.shtml