【Watch記事検索】
最新ニュース
【11月30日】
【11月29日】
【11月28日】
【11月27日】
【11月26日】

3Dゲームファンのための「鬼武者3」エンジン講座
「鬼武者3」はPS2史上最高位のグラフィックを目指す(後編)




■ PS2では世界初? ~リアルタイム光散乱表現に挑戦

図1、光散乱シミュレーションの模式図。CLUT(s)=深度情報sを引数としたColor Look Up Table関数、βR=レイリー散乱係数、βM=ミー散乱係数
光散乱シミュレーションのデモンストレーション
昼間の晴天の情景
指向性を高く設定すればご覧の通り。曇り空の昼間の情景を表現可能
減衰拡散を強くすればフォグ機能を使わなくても霧が出ている情景を表現できる
 SIGGRAPHで行なわれた「鬼武者3」プレゼンテーションでは、PS2のリアルタイム映像とはとても思えないような、非常に印象的なシーンが公開された。それは山岳シーンでの「光散乱(ライト・スキャッタリング= Light Scattering)」表現を行なった映像だ。光散乱とは、光が大気の密度の揺らぎや、大気中の微粒子等によって散乱する現象のこと。これでは何がなんだかわからない人が大半だろう。以下、順を追って解説しよう。

 突然だが、昼間は空が青いし、日が昇るときや日が沈むときの空は赤い。当たり前のことだがなぜだろう? 「空」とは突き詰めて考えると「漆黒の宇宙に浮かんでいる太陽を、地球上の大気を通して見ている」という風に考えられる。

 太陽光は赤橙黄緑青藍紫の七色の光から成っているのは多くの人が知っていると思う。ところで、この様々な色の光だが、波長が短い色ほど散乱しやすく、波長が長い色ほど散乱しにくい性質がある。そう、波長が最も長い色は赤、最も短いのは紫だ。つまり、大気中の微粒子等に光が衝突すると、紫に近い色ほど散乱し、赤に近いほど散乱しにくいということになる。

 昼間の空が青いのは、直上付近から降り注ぐ太陽光の青色が散乱し天空を覆うからなのだ。なお、空が紫や藍に見えないのは高高度で拡散して地表に到達する量が少ないため。  一方、明け方や日暮れの空が赤いのは、低い位置にある太陽光が、昼よりも大気中を長く通らなければならず、これにより、散乱しがちな青系よりも、散乱しにくい赤が強く観測者に届くためだ。

 「鬼武者3」では、こうした光の散乱という物理現象を、簡略化したモデルではあるが、リアルタイム実装することで非常にリアリスティックな屋外ライティング表現を実践している。実装としては、イメージベースのフィルタ処理系として実装されているのだが、まったくのでたらめではなく、近似という形になっているので、方法論としても最終的なビジュアルとしても説得力の高いものになっている。

 図1はその概念図を示したものだ。「鬼武者3」では、この光の散乱現象を

(1)光の減衰(大気に吸収される光/視界から遠ざかる光)
(2)光の加算(視界に入ってくる光)

という2つの処理系で実現している。ちなみに、図中の上のパスが(1)、下のパスが(2)に対応する。

 上のパスから見ていこう。まず、処理の“種”となるのは、シーンをレンダリングした際の深度情報(Zバッファ)だ。Zバッファとは本来はシーンの奥行き関係を考慮して描画するための作業領域なわけだが、シーン描画を完了した時点での最終的なZバッファの内容は、視点から見たシーン内の各オブジェクトまでの距離が画素単位で記録されたものになる。

 現実世界における光の拡散は、光が観測者に届くまでの距離に起因したものだ。シーンの深度情報とはシーン内の奥行き、すなわち距離なのだから、これをキーにした処理系を実装すれば光の拡散を再現できるはずだ。この処理系は、関数による計算をその都度行なうのではなく、深度情報から答えを取り出すような、演算結果を数値テーブルから取り出す仕組みで実装されている。

 この処理系は「PS2の持つ32ビットカラー、RGBα各8ビットのうち、αCHをRGBカラーのインデックスに使用する」という機能を用いて実現している。この処理系によって算出されるのはシーンの光の減衰分布(図中のFex)になる。

 この処理系はビジュアル的には、霧(フォグ)のような空気遠近表現を行なうことに貢献する。近似表現ではあるが、物理的に意味をなす結果となっているので、シーンのジオメトリ構造を無視した視点からの距離のみで色を付ける「通常のフォグ表現」よりもリアリティに富んだビジュアルを形成する。

 今度は下のパスについて見てみよう。ここでは、光源(例、太陽)がどのように視点に届くかということを求めている。最下段中央付近に見えるオレンジ色の光球はデザイナーが描いたものではない。これは、光源が天空のどの位置にあるかを仮想的に設定、画面内でこの光源がどのように拡散、あるいは収束するかを図中の左下の式により計算し、テクスチャにレンダリングする形で求めている。このテクスチャはライトマップ(Light Map)として後の処理で活用することになる。ちなみにライトマップとは光の分布をテクスチャ化したものを指す。なお、「鬼武者3」では、この下段のパスを分割したポリゴンに頂点カラーとしてライトマップを適用し、フォグイメージの画像とライトマップの乗算合成をテクスチャとフラグメント値としてハードウェア的に加算合成することで1パスで下段処理を完結させているという。

 さて、光の散乱には、均一な散乱である「レイリー散乱」と指向性のある散乱である「ミー散乱」といったものがあるが、こうした散乱現象を数式化したものが左下の式だ。イメージ的に言えばここでは「もし太陽がこの位置に来ていれば空はこう見える」というのをライトマップとしてレンダリングしているのだ。

 これを上のパスと同様に、深度情報をキーにして求めた「光が距離によってどう拡散されるか」を表す情報(上のパスとは違って補数になっている点に注意)と掛け合わせることで、このライトマップ(太陽)がどのように視点に届くかを求めている(Lin)。ビジュアル的には山の向こうの太陽光が山の輪郭を飛び越えて漏れだしてくるような表現に繋がる。

 こうして処理してきた上のパスの映像と下のパスの映像、そして通常のレンダリング映像(L0)を合成することで、光拡散を考慮した屋外シーンが完成する。この一連の近似的な光散乱シミュレーションはレンダリングパス的には2~4パスほどかかるが、負荷的にそれほど重い処理ではないと判断できたために、「鬼武者3」への実装が決まったそうだ。

 その効果は視覚的にも絶大で、いわゆるレンズフレア表現や一般的なフォグ表現とは一線を画したリアリティを達成している。また、天候変化、朝昼夜の時間変化をプロシージャル(そのためのデータを別途用意せずに構造的、算術的に行なえること)に連続的に行なえるという利点もある。つまり、任意のシーンを追加データを用いずに、「曇りの朝」だろうが「晴れの昼間」だろうが、自在の環境を作り出すことができるのだ。

 「鬼武者3」では、野外のシーンでこの効果が用いられているので、実際のプレイの際にはぜひともこのことを意識してそのビジュアルを楽しんで欲しい。

朝から夜中に至までの連続写真。シーンのジオメトリモデルは固定した状態で光散乱シミュレーションにより昼夜を再現。空の色などはそうしたテクスチャを用意しているのではなく、本文で解説した様な物理シミュレーションの結果でこのような映像になっているのだ


■ こだわりぬいた影表現~3つの影技法

NVIDIAロゴが描かれたテクスチャを、シーンに投影するような形でテクスチャマッピングしている。これが「投射テクスチャマッピング」。ライトマップをこの方法で投射すればスポットライト表現も可能だ。実際、「鬼武者3」ではこの応用技も使われている
木の枝の影が地面に投射されることで表現される"木漏れ日"表現。キャラクタだけでなく、シーン全体に落ちる様な影表現もリアルタイム・プロジェクション・シャドウ技法ならではのもの
曇り空では、影エッジのフィルタリング処理を強めにして実体がほとんど見えない影表現を実現
空中に浮遊する物体の影は投射距離も長くなるのでぼける。その様子も再現
 3Dゲームグラフィックスでは、パフォーマンスを稼ぐ意味合いから、第3者が光源を遮蔽すること(すなわち影)に関しての陰影処理を省略するケースが多かった。しかし、近年においては、ソフトウェア技術の向上もあり、影の表現についてこだわりを見せる作品が増えつつある。

 実在俳優をゲーム内にキャスティングするという写実表現を基本コンセプトとする「鬼武者3」において、足元にただの丸影スプライトを置くといった簡易表現は許されなかったようで、PS2用ゲームとしてはかなり高度かつこだわりの影表現を行なっている。ゲームプレイ時にはぜひとも影表現にも着眼してほしいと思う。

 「鬼武者3」では、主要キャラクタに対して、非常にリアルな影が描画されており、しかもただ地面に敷かれるだけでなく、壁や柱、その他の小道具、大道具オブジェクトにも投射される高度な影表現が行なわれている。また、その影そのものも、キャラクタの輪郭が常にはっきりしているものではなく、晴天や曇り空、あるいは光源からの距離などに起因して姿を変えるという凝りようだ。

 具体例を挙げると、太陽の昇っている昼間はシャープな輪郭の影だが、曇り空になるとぼやっとした感じのいわゆる半影となる。人物の影ならば足元は輪郭がはっきりした影だが、投射距離が長くなる頭部の方に行くに従い徐々に半影になっている。そう、現実世界の影に準拠した表現になっているわけだ。

 さて、こうした鬼武者の影表現はどのような仕組みで実現されているのだろうか。「鬼武者3」における影描画は大別して3つの方法によって実現されている。まず、主要キャラクタの影については、最近の3Dゲームでは採用例が多くなっている「投射テクスチャマッピング」を使った影生成技法の独自拡張形を採用している。

 投射テクスチャマッピングとは、テクスチャを、シーンやオブジェクトに対して映写機で投影するような形で貼り付ける技法のことだ。この投射テクスチャマッピング技法を使った影表現を特に「プロジェクション・シャドウ技法」と呼ぶこともある。

 この技法は、光源を仮想視点として3Dオブジェクト形状をテクスチャにレンダリング、これを影として光源方向から投射テクスチャマッピングを行なうことで実現する。一般に、この技法で作成する影テクスチャはメモリ節約の意味合いから低解像度のものになり、このまま投射テクスチャマッピングを行なうとジャギーが目立つ。「鬼武者3」では、これをPS2のグラフィックシンセサイザーのバイリニアフィルタリング機能で平滑化しており、これが丁度影のエッジが柔らかいビジュアル表現に結びついている。

 非常にユニークなのは、このフィルタリング処理の際に、光源位置、光源方向、距離減衰、光源遮蔽面積を考慮したシーン適応型のアルゴリズムを採用している点だ。これが、前述の「足元くっきり」、「頭の方ぼんやり」の写実的な影表現の秘密になっている。

足元くっきり、頭ぼんやりの「鬼武者3」のリアルタイム影表現。これは蛍光灯のような線光源、面光源表現を再現したもの


■ 負荷の高いシーンで使われる代替影生成技法とは?

半影表現の丸影をボーン形状に合わせて配置した「鬼武者3」オリジナル高速影表現。たしかに簡易表現の影には見えない
登場キャラクタが増えてくるとこの特殊丸影表現が多用されることになるが、シーン全体としてみた場合の違和感はまったくない
 前半で述べたように「鬼武者3」では大勢のキャラクタが同時に登場する。そのすべてのキャラクタに対し、プロジェクション・シャドウ技法を使うことはPS2ではやはりパフォーマンス的に厳しい。そこで、「鬼武者3」では、負荷が高いシーンや、遠方の敵キャラなどに使用するもうひとつの影技法が用意されている。

 これは基本的な処理系としては、丸影処理なのだが、ただの丸影ではない。3Dキャラクタ内部にはボーンが仕込まれていることは前半で解説したが、このボーンの形状に従う形で小柄な丸影スプライトを地面に並べることで、キャラクタ形状に準拠した、見た目にもプロジェクション・シャドウと大差ない簡易影を描画しているのだ。言い換えると、丸影片を、地面に投射された「人の形状(実際にはボーン)」に並べて描画しているわけだ。

 その丸影1つ1つは半影であり、足元が濃く、頭部に行けば行くほど薄くなっているので、シーン全体としてみた場合に、プロジェクション・シャドウと同居していても違和感は少ない。そして、ちゃんとキャラクタの動きに(ボーンの動きに)連動して、この小さな丸影パーツも動くので、ただの大きな丸影を足下に置く従来簡易技法と比べると、影としての存在感も圧倒的に高い。また、負荷も軽く、この技法の演算、描画負荷は、全体の数%で済むとのことだ。そう、この影生成は群衆シーンで威力を発揮するのだ。


■ リアルタイムの背景にプリレンダーの影

背景物の影はレンダー・バーデックスによるもの。違和感はない
敵キャラの影は特殊丸影によるもの。手すりの影などはレンダーバーテックスの影だ
 3つ目の影技法は、背景や建物などの影にまつわるものだ。「鬼武者3」では背景がリアルタイム3Dグラフィックスになったことは既に述べたとおりだが、その際に問題となるのがそうした背景物の影生成だ。

 キャラクタの影生成に使っているプロジェクション・シャドウ技法は、テクスチャメモリの制限もあり、大きなものの影生成には向かない。しかし、背景や建物に影が全くないのでは、シーン全体としてのビジュアルに統一感が欠如する。そこで、「鬼武者3」では、「レンダー・バーテックス(Render Vertex)」と呼ばれる技法を使うことで、この問題をクリアしている。

 具体的には、「背景物は形状変化がない」、「光源は動かない」という仮定の下、背景物をデザイン/モデリングする段階で影を生成してしまうアプローチを取っている。いわば、「影のみプリレンダー」というイメージになるだろうか。

 ただし、影をテクスチャとして生成するとテクスチャメモリを消費してしまう。そこで、「鬼武者3」では、背景を構成するポリゴンの頂点情報に影情報を埋め込む形でプリレンダーしてしまっている。具体的には、ポリゴンデータのモデリング時に、影となる頂点に対して影情報をあらかじめ埋め込んでおき、実際のレンダリングにそれを反映させるという手法を採っている。

 3Dグラフィックでは、各頂点にXYZ座標の3Dジオメトリデータ以外に、様々な属性を持たせることができる。「鬼武者3」では、いってみれば、背景を構成するポリゴンの各頂点が、自分が影になるかどうかの属性を持っていると考えるとわかりやすい。

 最終的なレンダリング時には、そのポリゴンの頂点が影属性ありならば、色を黒っぽく陰影処理をすればいいことになる(実際にはもうちょっと高度)。ここまでわかると、この技法の名前の由来も見えてくるはずだ。「頂点(Vertex)にレンダリングする」から「レンダー・バーテックス」なのだ。

 なお、このレンダーバーテックスは「Softimage | XSI」の機能として提供されており、影情報の埋め込みは、背景モデリング段階で行なってしまう。この際の影計算処理は「Softimage | XSI」上で時間をかけて行なえるので、非常に複雑なジオメトリ構造であっても正確に影生成を行なってくれる。

 ただ、リアルタイムで処理されているとはいえ、結局のところレンダーバーテックスによる影は「決めうちの影」なので、建物側の影がキャラクタに投射されたりするような表現は基本的には実現されない。このあたりの妥協は、実際のゲームパフォーマンスとの天秤掛けでトレードオフとして出された答えのようだ。

 影の解説が非常に長くなってしまったが、実際、「鬼武者3」における影生成エンジンは様々な実験の末、やっと今の形に収まった処理系だそうで、「鬼武者3」グラフィックスの見どころの1つでもあるのでご容赦いただきたい。実際のプレイ時、どこにどの技法の影が落ちているのかを意識しながらゲームを進めていくのも、きっと楽しいことだろう。

(C) CAPCOM CO.、LTD.
※記事中の写真は開発中につき、製品版とは異なる場合があります。

□カプコンのホームページ
http://www.capcom.co.jp/
□「鬼武者3」のページ
http://www.capcom.co.jp/onimusha/
□関連情報
【3月10日】PS2「鬼武者3」、帰ってきた金城武、そしてジャン・レノも出演!!
舞台は現代のパリへ……世界展開を見せる最新作
http://game.watch.impress.co.jp/docs/20030310/capcom.htm
【4月4日】現代と戦国時代、パリと日本が交錯するPS2「鬼武者3」最新スクリーンショット公開
http://game.watch.impress.co.jp/docs/20030404/on3.htm
【5月20日】カプコン、PS2「鬼武者3」続報
フランス軍人鬼武者ジャック・ブランの武器は「ムチ」
http://game.watch.impress.co.jp/docs/20030520/oni3.htm
【9月12日】3Dゲームファンのための「鬼武者3」エンジン講座
「鬼武者3」はPS2史上最高位のグラフィックを目指す(前編)
http://game.watch.impress.co.jp/docs/20030911/oni3.htm

(2003年9月12日)

[Reported by トライゼット西川善司]


Q&A、ゲームの攻略などに関する質問はお受けしておりません
また、弊誌に掲載された写真、文章の無許諾での転載、使用に関しましては一切お断わりいたします

ウォッチ編集部内GAME Watch担当game-watch@impress.co.jp

Copyright (c) 2003 Impress Corporation All rights reserved.