渓谷に住む水棲怪物が飛行船に襲いかかるも,この攻撃をなんとかかわし,非常エンジンに点火して脱出を試みる。このシーンも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のライトブルーム(光の溢れ出し)を起こしているのは,その成果である。
●波の表現が一歩進んだ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スキャンのような輪切りにしたテクスチャから,実際に視点方向から見たときの立体物としての映像を再構成してやるレンダリング技法のこと。この例では,霧の密度を白黒の明暗で表した輪切りテクスチャを用意していると思われる(ホワイトペーパーにそこまでの解説はない)。
医療や設計業務などのボリュームレンダリングでは,高解像度でしかも膨大な数の輪切りテクスチャ(ボリュームテクスチャ)を生成し,実際のレンダリング時も輪切りテクスチャと視線との交叉点を多く取って描画していかなければ中抜けした変な映像になってしまう。しかし,この場面ではもやの濃淡がそれっぽく見えればいいので,かなり大ざっぱなものを実装しているようだ。資料によれば,実際の1画素をレンダリングするにあたり,輪切りテクスチャへのサンプリングはたかだか5点とのこと。ただし,この霧は広範囲に分布しているので負荷はそれなりにありそうだ。この表現のためのピクセルシェーダプログラムの命令比率は(算術命令:テクスチャ命令)=(20:1)で,テクスチャユニットよりもピクセルシェーダのほうに多くの負荷がかかると説明されている。
●色が変わっただけではない水棲怪物
最後に怪物の材質シェーダについても触れておこう。Canyon Flightの主役キャラである水棲怪物は,色が変わったところに目が行ってしまうが,実はそれだけではない。毒々しくもプリプリっとした半透明の肉感を表現するために,擬似的な表面下散乱(Subdurface Scattering)を実装しているのだ。
表面下散乱とは,光がその材質の中を伝って出てくる現象をいい,身近なところでは光にかざした手のひらが鈍く光ったりするあれだ。半透明材質であることを表現するのに適しているほか,人肌の表現にも有用であるとして3Dグラフィックスの研究テーマとしては最近盛んになっている。
3DMark06では,NVIDIAがGeForce 7800 GTX用に用意したデモ「Luna」でも実装されていた,光散乱と同種の疑似的な手法が用いられている。
まず,光散乱を行う対象物(このシーンでは怪物)の光源からの深度情報と視点(カメラ)からの深度情報をZバッファレンダリングで求める。これにより視点から見た対象物の厚みを算出。続いて視線方向と,その対象物を構成している面(ピクセル)の法線方向と,先ほど求めた厚みから,どのくらい光が漏れてくるかを近似的に算出している。本来はレイトレーシング的な手法を用いなければならない光散乱シミュレーションだが,この大胆なマルチパスレンダリング手法による近似でもそれっぽく見えるので,効果としては大きい。
NVIDIAのデモ「Luna」に登場した半透明モンスター「fishboys」。この疑似表面下散乱表現と同種のものが3DMark06に実装された | 疑似表面下散乱により,水棲怪物が持つ,半透明の肉感がよく表れている |
ほぼ同一のシーンで3DMark05(左)と比較してみた。3DMark05だと硬い質感の水棲怪物だが,3DMark06(右)だと,ゼリーっぽい,柔らかな感じになっている |