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

Game Developers Conference 2007現地レポート

西川善司の3Dゲームファンのためのグラフィックス講座
~「CRYTEK CRYENGINE2.0」GDC 2007特別編~
屋外の自然表現にこだわったリアル系グラフィックスマジックの秘密

3月5~9日開催

会場:Moscone Convention Center

サンフランシスコで開催中のGDC 2007
 Windows Vistaが登場して早くも1カ月が過ぎた。同時にDirectX 10がリリースされ、初のDirectX 10対応GPU、NVIDIA GeForce8800シリーズも流通している昨今ではあるが、未だにその先進3Dグラフィックス技術を体験できるアプリケーションは出ていない。そんな中、DirectX 10テクノロジーを積極活用したタイトルとしてその登場が期待されているのが独CRYTEKが開発中の「CRYSIS」だ。

 現在、サンフランシスコで開催中のGDC 2007において、この「CRYSIS」のゲームエンジンである「CRY ENGINE2.0」に関連したセッション「Realtime Atmospheric Effects in Games Revisted」が行なわれたので、その内容をレポートしたいと思う。


■ 全世界が注目する新世代ゲームエンジン「CRY ENGINE2.0」

CRYTEK、Carsten Wenzel氏
 ドイツに本拠地を置くCRYTEKは、その事実上の処女作「FARCRY」で一世を風靡した実力派ゲームスタジオだ。このFARCRYのゲームエンジンが「CRY ENGINE(1.0)」で、当初はEPIC GAMESの「UNREAL ENGINE3.0」のように、マルチプラットフォーム展開を狙ったゲームエンジンビジネスにも力を注ぐ戦略を目論んでいたのだが、こちらは成功を収めてはいない。ただし、その技術的な先進性は「FARCRY」により広く認知されており、その次世代バージョンとなる「CRY ENGINE2.0」(以下、CE2)には業界から熱い視線が注がれている。

 CE2では、どうしても作り物っぽくなってしまう屋外情景のリアル表現にこだわっており、今回のセッションでは、そのために実装されたユニークなグラフィックス技術が紹介された。自然界のリアル表現というのは、数学的な視点で見るととてつもなく複雑であるため、これまでの大半の前例と同じく、CE2でも大胆な近似的アプローチにより実装を模索したとしている。大胆な近似とはいえ、DirectX 10世代のGPUパワーを活用することにより、かなり理にかなった洗練された方法を実装している。

 CRYTEKが導入したのはシーン・デプス・ベースド・レンダリング(Scene Depth Based Rendering)というテクニック。これは視点からの視界の深度値(Z値)を先に求めてしまい、この値を用いて様々なポストプロセスを行なっていこうというのが基本方針になる。意味的には、作り上げたシーンを観察者から見て視界がどのような奥行き構造になっているかを先に把握してしまう、ということだ。これがどういう意味を持ってくるかは後々わかってくる。ちなみに、ピクセル陰影処理を完全に省略してそのシーンの深度値だけを求めるZバッファレンダリングだけを行なって、以降のパスでそのZバッファの内容を反復活用して複雑な陰影処理を後回しにする「ディファード・レンダリング(Deferred Rendering)」というテクニックがあるが、発想はこれに近い。

シーンの深度情報を先に求めてそれを利用してポストプロセスのレンダリングを行なうのがScene Depth Based Rendering



■ 空の光のレンダリング

 一般的なゲームでは、「空」はアーティストが描いた空や写真を元に作成した画像等で表現することが今でも多いが、「CE2.0」では、リアルな空を再現するために、地球上の観測者を取り巻く半球(天球)の空の光の状態を計算で求めるアプローチを実装している。現実世界の空は、時刻によって太陽の位置が決まり、そこから観測者に向けてその光がどう伝わっていくかで見え方が決定される。これを求めるのだ。太陽の位置が決まると、光が空をどう伝搬するかは「レイリー散乱」と「ミー散乱」という2種類の光散乱現象(Light Scattering)を表した方程式を解いて求める。

書き割りの空ではなく、空の天球をシミュレーションを実行してレンダリング 天球上の太陽の位置を確定したあとはミー散乱とレイリー散乱の方程式を解いて天球を生成する


SM2.0/3.0世代のGPUであれば、ピクセル単位で光散乱の方程式を求めることも可能
 「CE2.0」では、この天球テクスチャの計算解像度は128×64サンプルとしており、一応リアルタイムでCPU計算させるが、毎フレームではなく、複数フレームにまたがってゆっくりと行なう実装になっているようだ。まあ、太陽の位置が1フレームごとに切り替わることはあり得ないし、やってもあまり意味がないのでこういう実装になっている。計算結果は浮動小数点テクスチャに格納され、これが天球ライトマップとして扱われて以降のパスで利用されるようになる。

 なお、シーンをレンダリングするピクセル解像度よりも天球テクスチャ解像度のほうが圧倒的に低解像度になるので場合によっては天球がブロッキーな見た目になる不具合がでてしまう場合がある。これについては、より高い生成精度が求められる太陽そのものなどはピクセル単位の解像度でGPUで計算しているとのことだ。SM3.0/4.0世代のGPUであれば光散乱の方程式をピクセル単位に解いて直接テクスチャにレンダリングすることもできるためだ。

 こうした計算で天球テクスチャを求めるというアプローチは、実は「CE2.0」が初めてではなく、既に一部のソフトでも実装されている。本連載で取りあげたPS2用「鬼武者3」でも、これとほぼ同種のテクニックを実装しているのは有名な話だ。


■ 「CE2.0」におけるフォグ

 シーン全体を覆うフォグは距離に応じて霧が濃くなる「距離フォグ」と一定の高さまで立ちこめる「高さフォグ」の組み合わせで表現されている。これを「CE2.0」では「大局的なボリュームフォグ」(Global Volume Fog)と呼んでいるが、この大局的なフォグのシーンへの合成は、冒頭で述べたように求めた視点から見た深度値を用いてフォグ色を決定する。具体的には画面内のうち、遠くまで開けている部分は何もない空間が多いのでフォグによる光散乱が多くなると言うことでフォグ色が強くなるが、視点から近い場所に遮蔽物があるような部分では光散乱が少ないのでフォグ色は薄くなるようなかんじだ。なお、そのフォグ色そのものは、事前に求めた天球の平均色を用いているとのこと。

大局的なボリュームフォグとはシーン全体を覆うように広がるフォグ
空とフォグの合成 フォグの色は天球の平均色
天球をシミュレーション生成。フォグの合成はシーンの深度情報を利用して行なう。シーン中の開けたところのフォグが白っぽい
太陽を任意の位置にすることによって現実世界に近い朝昼夜の天球を生成可能。フォグは天球の平均色で生成


 「CE2.0」におけるフォグはそうした画面を広く覆うフォグ以外に、立体的な形状を持つ局所的なフォグ(ボリュームフォグ:Volume Fog)表現にも対応している。形状単位としては立方体形状や長球形状に対応しており、その形状の前面と後面との差分から、そのフォグ領域の厚みを求め、視線がその厚みをどう突き抜けるかをピクセル単位で求めて(レイ・キャスティング)、フォグの色を求めている。このフォグは、前出の距離や高さといった基本パラメータだけのフォグとは違い、立方体、長球といった単位形状を組み合わせた、自由な形のフォグをシーンに配置することができるのが特長だ。

フォグボリュームは立方体、長球を単位として任意の形状で生成可能
立方体形状のフォグボリューム
長球形状のフォグボリューム


 半透明のオブジェクトとそうしたフォグが同居する場合の合成がややこしいわけだが、「CE2.0」では、許容できる範囲で簡易的な近似処方を実装している。前述の「大局的なボリュームフォグ」との合成は、半透明オブジェクトは頂点単位に持たせた半透明情報を利用し、「ボリュームフォグ」との合成は、CPUで求めておいたその半透明オブジェクトの半透明率を用いて合成している。

フォグと半透明オブジェクトの合成



■ ソフトパーティクル~今世代ではもはや常識?

 煙や火炎などの表現は、煙や火炎などの模様を描いたテクスチャを四角形に貼り付けたようなポイントスプライトを複数描画してそれっぽく見せるパーティクルシステムを活用するのが一般的だが、シーン内の他の3Dオブジェクトと交叉するとその交叉線が強く出てしまう。PS2などのゲームにおいて、爆炎が立ちこめるシーンで、その炎や煙に強い切り取られ線を目の当たりにしたことがあるだろう。あれだ。

 これは非常に不自然であるため低減させるテクニックが最近は台頭しつつある。「CE2.0」では、本連載の「ロストプラネット」編で使われたものと同じアプローチが採用されている。これはパーティクル側に仮想的な厚みを持たせ、その厚みを配慮した状態でパーティクルを書き込み、その厚み情報が、そのシーンの何かと交叉するようであれば、そのパーティクルのそのピクセルの色を薄めてやる。すると、交叉線を目立たなくすることができるのだ。

パーティクルとシーンとの交叉線を見せないソフトパーティクル ソフトパーティクル処理無しの爆煙パーティクル。地面に鋭い交叉線が出てしまっている ソフトパーティクル処理ありの爆煙パーティクル。地面と爆煙が自然な形で合成されている



■ 雲のレンダリング~自然に見える工夫とは?

各雲は複数のスプライトを組み合わせ形成させている
 「CE2.0」では、雲のレンダリングに「フライトシミュレータ2004」にも採用されたMicrosoft ResearchのNiniane Wang氏の手法を活用している。これは、複数のスプライトを組み合わせて雲を形成するというもので、いわゆる普通のパーティクルシステムによるもの。しかし、空からのライティング、太陽からのライティングをその雲パーティクルに行なうことで、パーティクルシステムベースとは思えない陰影感とボリューム感、立体感のある表現が行なえる。実際には平面でしかないパーティクルへの疑似ライティングについては、本連載「ワンダと巨像」編に詳しいが、基本的な概念はこれと同じで、パーティクル(ポイントスプライト)の4つの頂点に対して頂点単位のライティングを行なうだけだ。

雲の生成はマイクロソフトの「フライトシミュレータ2004」と同種の技法を採用


 「CE2.0」では雲パーティクルにはテクセル単位の雲の形状の厚み情報を待たせており、ソフトパーティクルと同じ処理を行なって、山と雲が重なったときに切り取られエッジがでないように工夫している。また、この厚み情報を利用して、逆光になったときの、雲からの光の漏れ具合のポストプロセスも適用している。「CE2.0」では、ちゃんとパーティクルシステムで生成した各雲固有な形の影が大地に投射される。これは非常に印象的なビジュアルだが、原理は単純で、雲パーティクルに仮想的に設定してある厚み情報のシルエットをシャドウマップ・スペースに投射しているだけで、雲以外の他の影生成と同時に処理できるようになっている。

「CE2.0」では動的生成された雲はちゃんとその固有形状の影を落とす


 全部の雲をこの手法でリアルタイム描画していては負荷が高すぎるので、視界の関係上必然的に数が多くなる遠くの雲については、この雲パーティクルシステムで生成した雲を、半リアルタイムにテクスチャにレンダリングして、2Dテクスチャとして利用してしまう妥協方法を用いる。

遠くの雲は動的な雲では無く2Dベースの雲。ただし、太陽の位置、厚み、密度に配慮して生成 遠方の雲はテクスチャにレンダリングして1枚絵として取り扱う 動的な雲と静的な雲を組み合わせている


 完全に書き割りの空ではなく、ちゃんとこの雲生成システムで生成した雲をテクスチャ化したものになるので、リアルタイム描画される動的な雲とのビジュアル面でのマッチングもいい。しかも、太陽の位置や空の色具合によってちゃんとライティングされてレンダリングしてテクスチャ化するので、陰影的にもリアルタイム雲とのつじつまが合う。もともと、空の雲は動きの早いものではないので、毎フレームではなく、ゆったりとしたサイクルで、複数フレームにまたがって更新すればいい。CRYTEKによれば、GPU性能如何によって更新タイミングを変えてもいいだろうとのことだ。

遠くの雲例。2Dベースのフェイクの空だが、ちゃんと天球や空の色とつじつまのあった雲になっているので不自然さはない



■ 水面の処理~さざ波表現のその先へ

 水面表現も今や3Dゲームグラフィックスには欠かせない要素となっている。水面表現といえば本連載でも様々なゲームで活用されている法線マップを活用した環境バンプマッピングによる「さざ波」表現、水面までの距離に応じて異方性反射をするフレネル反射の再現といったテクニックをたびたび紹介してきているが、「CE2.0」ではそれらは大前提としてそれ以外の細かいテクニックが実装されているのでそちらを紹介しよう。

 「Halflife2」を初めとして、水面が登場するゲームの水はやたら澄んでいて綺麗ではなかったろうか。現実世界の水はあそこまで透明度が高くないことが多い。「CE2.0」では、このやや濁った水を表現するためのテクニックを実装している。とはいっても、水面から下に向かってフォグを発生させて不透明感を実現するという単純なモノだ。また、水面と水辺の交叉線が強く出てしまっている3Dゲームグラフィックスを見たことが多いと思うが、これについても低減処理を行なっている。これは、ソフトパーティクルとの交叉線の低減と同じ発想で、シーンの深度情報と水面位置が近いところは水面と水辺をブレンドして交叉線を消している。

川のレンダリング。水面と岸辺との交叉線はソフトパーティクル的なアプローチで消している 極めて自然な「CE2.0」における水面表現


 海のような水深が深い水面下についてはさらに特別な処理を適用している。「CE2.0」では水面下に潜ることもあるので、水面下と水面上での2パターンの処理に対応しているが、考え方が逆なだけで処理はほぼ同じ。

水深の深い水の表現は特別処理。これを「CE2.0」ではOcean Shadingと命名している 水面下を視線が長く水中を行けば行くほど減衰が強くなり不透明感が強くなる。ただし、水面からの光の光量はより多く届くことになる。このパラメータを調整することで、水質の感じが自在にコントロールできるようになるのだ
水底から水面を見上げたとき 同じシーンにおいて別の水質パラメータで水底から水面を見上げたとき。1つ前とは違い、密度がより濃いものになっている
水底を見下ろしたとき 同一シーンで別の水質パラメータで水底を見下ろしたとき。1つ前と比較して密度が濃いために水底に向かって開けていると水底方向は暗く見える



■ CRY ENGINE2.0は屋外表現が美しいゲームエンジン

左が現実のハワイの写真。右が「CE2.0」でレンダリングしてリアルタイム生成したシーン
 「CE2.0」は、徹底した屋外表現の自然表現のリアリティにこだわっており、特殊なシチュエーションではない、日常の屋外をリアルに表現できるエンジンとして台頭してきそうな予感はする。お化け屋敷やテーマパークを作ることに特化した「Unreal Engine3.0」とはまた違った独特のカラーが出せており、今度こそ、エンジンとしての健闘が期待できそうである。

□Game Developers Conference(英語)のホームページ
http://www.gdconf.com/
□Game Developers Conference(日本語)のホームページ
http://japan.gdconf.com/
□CRYTEKのホームページ
http://www.crytek.com/

(2007年3月7日)

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



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

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

Copyright (c)2007 Impress Watch Corporation, an Impress Group company. All rights reserved.