連載
西川善司の「試験に出るゲームグラフィックス」(5)レイトレアプローチで作り上げた「The Tomorrow Children」の先進ビジュアル,中編
中編となる今回は,その独特なVCT手法を踏まえたうえで,その他のグラフィックス要素をどのように実現しているかを見ていくことにしたい。
VCTの理解を前提にした解説もあるので,不安な人は前編を一度復習してから戻ってきてもらえればと思う。
西川善司の「試験に出るゲームグラフィックス」(4)レイトレアプローチで作り上げた「The Tomorrow Children」の先進ビジュアル,前編
VCTによって影は自動で得られるが,より局所的な影の生成にはSSDOを採用
The Tomorrow Childrenが採用したVCTベースのレンダリング手法というのは,言ってしまえば,大ざっぱなレイトレーシング手法である。
そこでは,直接照明だけでなく,間接照明の結果も自動で得られることになるわけだが,それはつまり,着目したピクセルにおける「他者からの遮蔽」の情報を取得できることにもなるわけだ。もっと言うと,「影は自動的に得られる」ということでもある。
マクラーレン氏:
影生成のためのシャドウマップ生成などは行っていません。
ゲーム世界に建つさまざまな施設オブジェクト群,そびえ立つ鉱山をはじめとした地形オブジェクト群の影は自動で得られているんです。ただ,VCT自体が粗いレイトレーシングのようなものですから,得られる影も大ざっぱなものになります。
前編でも解説したように,The Tomorrow Childrenでは,シーンをボクセルグリッドに分割して,そのボクセル情報を3Dテクスチャ上に格納しておく実装になっている。
ここで注意が必要なのは,最も小さな,解像度の高いボクセルでも,一辺は40cmくらいということだ。これでは,施設の外形(≒大雑把な形状)としての影は地面に落とせるかもしれないが,その施設の細かな凹凸のような「ディテールレベルの影」は生成されないことになる。
この部分に表現力の不足を感じた開発チームは,その「ディテールレベルの影」の生成に取り組むことにした。
そこで選択したのが,画面座標(Screen Space,スクリーンスペース)系の影(もしくは陰)生成技法だ。
画面座標系の影/陰生成技法として最も有名なのは,「SSAO」という略称で知られる「Screen Space Ambient Occlusion」(スクリーンスペース・アンビエントオクルージョン)だろう。これは,シーンの全ポリゴンをレンダリングしたあとに残った,当該シーンの最終奥行き値を表している深度バッファ(Z Buffer)の内容を解析し,着目しているピクセルが「局所的にどのくらい遮蔽されているか」を探査して,その遮蔽率に応じた陰影を付けていくという疑似影(陰)生成手法である。
ディファードレンダリング(Deferred Rendering)を採用したレンダリングエンジンでは,G-Buffer(=中間パラメータを収納する画面解像度と同解像度での作業バッファ)の内容に法線情報があるのでSSAO処理は効率がいいのだ。
しかしThe Tomorrow Childrenでは,SSAOよりも少しだけ進んだ「SSDO」を疑似影(陰)生成手法に採用している。
SSDOは「Screen Space Directional Occlusion」(スクリーンスペース・ディレクショナルオクルージョン)の略で,コンピュータサイエンス系の名門大学である独MPI InformatikのTobias Ritschel氏が発表した,SSAO拡張仕様のようなものである。Crytekの「CRYENGINE III」以降や,カプコンの「MT Framework 2.0」を用いた「ロスト プラネット2」でも採用実績がある技法だ。
……と言っても,SSDOの基本的なアルゴリズムはSSAOとほとんど同じ。異なるのは,SSAOで局所探査だけで済ませていた遮蔽率の計算を,別の情報を用いてより正確に行うところだけである。
たとえば,あるレンダリングエンジンが間接照明の処理系を実装していて,大ざっぱではあるがそのエリアの全方位の遮蔽情報を持っていたりすれば,その情報も活用する。前編で触れたとおり,The Tomorrow Childrenでは,描画解像度である1920
「欲しい情報」は着目しているピクセルの全方位遮蔽情報だが,The Tomorrow Childrenでは16方向にVCTを行っているので,その16方向のVCTで得られた情報を統合すれば,当該ピクセルの遮蔽率どころか,全方位の明暗分布をフルカラーで取得できる。
そこで,The Tomorrow Childrenでは,SSAO的に局所的な遮蔽率を求めたうえで,このVCTを経て得られた全方位のフルカラー明暗分布を統合して疑似影(陰)生成を行っている。
より具体的に言うと,VCTで得られた全方位のフルカラー明暗分布は,球面調和関数(Spherical Harmonics,スフェリカルハーモニクス)第2項まで(4係数)の表現に変換しているとのことだ。
話すと長くなるので,かなり簡略化して説明するが,球面調和関数とは,中心点から任意の長さの突起が突き出たような,もしくは凹んだような物体の形状を数学的に表すことのできるものである。
表現対象の形状を正確に表したい場合は,「項数」を多くすればいい。下の図はその概念を示したもので,たとえば,図の上から1段め(第1項,図ではl=0の段)の球面調和関数を用いれば1個,2段め(第2項,図ではl=1の段)までを使うなら4個,3段め(第3項,図ではl=2の段)までを使うなら9個,4段め(第4項,図ではl=3の段)までを使うなら16個,5段め……といった具合に,使う関数の数は増えていく。
そのとき使う関数の数を本稿では「係数」と呼ぶが,The Tomorrow ChildrenのSSDOにおける全方位遮蔽情報は,VCTで得られた全方位のフルカラー明暗分布を,この球面調和関数の第2項(4係数)までの概略表現に落とし込み,それだけおおざっぱなものにしているという。
この工夫,というか実装形態により,The Tomorrow ChildrenのSSDOでは,凹部が単に黒っぽくなるのではなく,そこに降り注ぐ全方位の光,あるいは間接光の影響までを受けたような疑似影(陰)が得られている。
キャラクターの影生成
プレイヤーキャラクターやNPC,モンスターなどの動的キャラクターは,地形や構造物などとは異なり,ボクセル化の対象から外れている。そのため,何もしないと,動的キャラクターはVCT時に「存在しない」ものとして処理されてしまう。結果として,地形や構造物のような淡い影すらも動的キャラクターには出ないことになる。
なぜ動的キャラクターをボクセル化対象から外したかというと,理由は簡単で,ボクセル化の最小サイズが前述したように一辺約40cmの単位となってしまうためだ。身長150cm前後の動的キャラクターをボクセル化するには,大ざっぱ過ぎるのである。
また,それ以外にも,動的キャラクターは多ポリゴンでモデリングしているため,ボクセル化の処理負荷も大きいというのもある。しかも,これは繰り返しになるが,ボクセル化の処理負荷が大きいにもかかわらず,一辺約40cmの精度でしかボクセル化できないのでは,まったく割に合わない。
そこでThe Tomorrow Childrenでは,発想を変え,ボクセル化されたシーンだけでなく,ゲーム内物理シミュレーションで利用する衝突判定に用いる「カプセル」(Capsule)モデルをも,VCT時の探査対象に含めることとしたのだ。
カプセルモデルは,実際のキャラクター3Dモデルと比較すれば大ざっぱであり,これをVCT対象にして生成する影も大ざっぱなものになる。しかし,そもそもThe Tomorrow Childrenの影は全体的に淡いので,見た目の収まりもちょうどよいという判断に至ったのだそうだ。
少なくとも,これで人型のシルエット(=影)は周囲の背景に出る。また,形状としては淡いがそれっぽいセルフシャドウも出る。
マクラーレン氏:
カプセルモデルによる影生成はPS3用の「The Last of Us」でも採用されていたテクニックですが,あちらは隣接する背景オブジェクトに影を落とすような一方向の投射,遮蔽でした。
我々の実装は,VCTの仕組みに統合させたので,16方向の投射,遮蔽が得られるんです。
乗り物の影生成
乗り物の影生成も,動的キャラクターの影生成とほぼ同様の実装形態になっている。
ただし,The Tomorrow Childrenに登場する乗り物は,移動することはあれど,それ自体が変形したり折れ曲がったりはしないため,形状としては静的なオブジェクトと見なすことができる。なので,その遮蔽構造は事前計算で求めておくことが可能だ。
事前計算で求めておく遮蔽構造とは,その乗り物の表面上、各ポイントにおける全方位の遮蔽構造であり,これは球面調和関数の第二項まで(=4係数)で表しておける。このとき,「各ポイントの遮蔽構造情報」は,実装レベルでは16方向,すなわち16枚分の32×32テクセルからなるテクスチャで表すことになる。
乗り物の遮蔽構造情報も,動的キャラクターの影生成のケースと同様に,VCT処理に統合して処理することになるのは言うまでもない。
なので,乗り物のシルエット(=影)が地面や背景に落ちるだけでなく,乗り物の内側(=車内)ではやや暗がりになるセルフシャドウ効果も得られる。
なお,動的キャラクターのカプセルモデルベースの影生成と同様に,乗り物の影も球面調和関数の第二項までの全方位遮蔽構造の集合体で表すことになるため,生成される影は,やはりぼんやりとしたものにはなる。
パーティクルのライティングと影生成
The Tomorrow Childrenでも煙や埃(ほこり),気体といったパーティクル表現は登場する。
ゲームグラフィックスのパーティクルは,粒子というよりはビルボード(Billboard,3D世界に存在する2D要素のこと。スプライト(Sprite)とも言う)のようなものだが,登場個数が多く,視点からの距離が近ければ画面に対する描画面積も多くなる。また,半透明パーティクルの場合は隠面除去(Culling,カリング)を行うわけにもいかない。
The Tomorrow Childrenだと,描画解像度である1920
ただ,描画負荷の高いパーティクル描画において,このVCTライティングをフルスペックで適用するのは難しいと,開発チームは判断したそうだ。もともと,パーティクルはぼんやりとした形状・存在ということもあり,The Tomorrow Childrenでは「大胆な割り切り」を導入した。
結論から言えば,パーティクルに対してピクセル単位(≒480×270ピクセル解像度)のVCTは行わず,パーティクルの頂点単位のVCTを行うこととしたのだ。
前編の「グラフィックス描画システムの秘密(3)」で述べたように,The Tomorrow ChildrenのVCTシステムでコーントレーシングを行うと,カスケード構造の3Dテクスチャからなる各ボクセルには,ゲーム世界の直接光および間接光の情報が格納されることになる。そこで,各ボクセルの中心点に注ぎ込んでくる全方位のRGB光の明暗分布を,これまた球面調和関数の第2項まで(=4係数)を用いて表現し,これを3枚のテクスチャで表す。なぜ3枚かといえば,
- RGB(3変数)×球面調和関数(4係数)=12要素
の値を記録しなければならず,テクスチャ1枚あたりαRGBで4変数が記録できるので,
- 12要素÷4変数=3枚
というわけだ。
パーティクルに対して,VCTを用いたライティングは行わず,「3枚のテクスチャで表される,大ざっぱな全方位RGB光の明暗分布」でライティングをするのである。
しかも,パーティクルのライティングは,ピクセル単位ではなく,各パーティクルの頂点単位で行う。たとえば四辺形ポリゴンで構成されるパーティクルであれば,4頂点でこの簡易ライティングを行うということである。
パーティクルは,必要に応じてテッセレーションを行い,ライティング適用先頂点を増加させることも行うようだ。
なお,いまここで「テッセレーション」というキーワードを用いたが,実際にはGPU側のテッセレーションステージやコンピュートシェーダを利用してはおらず,LoD(Level of Detail)的に,「事前に用意しておいた,分割数の異なるパーティクル」を切り換える形の実装になっている。
なお,不透明パーティクルの場合,ビルボード(≒スプライト)としてのジオメトリは,地形や構造物などと同等にボクセル化されるため,パーティクル自体の自己遮蔽や,他者オブシェクトの遮蔽,すなわち影の投射への配慮は行われることになる。つまり,あるパーティクルが別のパーティクルに影を落としたり,あるいは地面や周囲の背景オブシェクトに影を落としたりといった表現は,自動で得られるわけだ。
球面調和関数テクスチャ応用事例(1)〜疑似表面下散乱表現の実装
開発チームは,パーティクルのライティングに用いた球面調和関数テクスチャを「何か別のことにも使えそう」と考えたそうで,これを用いたいくつかの応用シェーディング事例をThe Tomorrow Childrenに組み込んでいる。
その1つは,表面下散乱(Subsurface Scattering:SS)表現だ。
表面下散乱表現と言えば,最近のゲームグラフィックスだと「画面座標系で実践する人肌シェーダ」を連想しがちだが,The Tomorrow Childrenの応用先は少し違う。地形なのだ。
The Tomorrow Childrenでキュー・ゲームスの開発チームは,翡翠(ひすい)のような,中身までが半透明な鉱石の山,いわば半透明な鉱山の材質表現に,表面下散乱技術を適用することにしたのである。
さて,その疑似表面下散乱手法は2つの要素からなっている。
1つめは,開発チーム内で「スタティックSS」と呼ばれるものだ。
具体的には,表現対象となるオブジェクトの表面位置(のピクセル)に対応する球面調和関数テクスチャをサンプルし,この色をボカしてレンダリング結果とする。
これは実際のところ,前述した「パーティクルの球面調和関数テクスチャを用いたライティング」とやっていることは変わらない。しかし,ここでの球面調和関数テクスチャのサンプルは球面調和関数の第1項まで(=1係数)に留め,その代わり必要に応じて,上のカスケードレベル(≒より広範囲の領域)の球面調和関数テクスチャのサンプルも行う点が少し異なる。
要するに,広範囲の大ざっぱな照明効果を適用しているわけだ。アプローチこそかなり異なるものの,やっていることの概念としては,「画面座標系で実践する人肌シェーダ」とよく似たものと言えるかもしれない。
そして,疑似表面下散乱実現のための2つめの要素は,開発チーム内で「ディレクショナルSS」と呼ばれるもので,こちらはズバリ,表現対象となるオブジェクトに対して逆光気味にやってきた光が,視点位置に向かって透過してくる散乱を表現するためのものになる。
これは,画面座標系でただボカすだけの疑似表面下散乱手法では実現できない要素だ。
とはいえ,これの実装自体はシンプルである。
表現対象となるオブジェクトの表面位置(のピクセル)において視線延長線方向にある球面調和関数テクスチャをサンプルし,その色を,前述したスタティックSSに混ぜてやるだけだ。
ここでも,球面調和関数テクスチャのサンプルは球面調和関数の第1項まで(=1係数)に留め,その代わり必要に応じて,視線延長線上の,より遠い側のSHテクスチャのサンプルも行うことになるが,これは,表現対象となるオブジェクトに対して逆光気味に漏れてくる散乱光の吟味に相当する。いわゆる「バックスキャッタリング」(Back Scattering)と言われる表現に相当するものだ。
マクラーレン氏:
そして,もう1つ。「霜」(Frost)の効果も,疑似表面下散乱表現の応用事例として盛り込んでいます。こちらも物理的には正しくないのですが,なんとも涼しげな氷菓子のような効果が得られているんですよ。
霜の効果は,冷たい氷のような鉱山を表現するにあたって活用されているもので,一連の2要素からなる表面下散乱表現を行ったうえで,表現対象となるオブジェクトの厚みが薄ければ薄いほど,白っぽさの影響が強くなるという変調を行う仕様になっている。
効果のほどはサンプル画像を見てもらうと一目瞭然。厚みが薄ければ薄い箇所ほど白く凍っている度合いが強くなっているような表現になっているのが分かるだろう。
この表面下散乱表現のシステムは,表現力の幅が広いのも特徴だ。
球面調和関数テクスチャが,VCTシステムの大局照明効果の結果を回収して生成するされるものであることは,パーティクルのライティングのところで解説したとおりである。また,前編で解説したように,The Tomorrow ChildrenのVCTシステムでは,「カスケード構造で管理する各ボクセル」に,光源からの照明効果の情報も反映されているので,これを簡略化する形でエンコードして生成した球面調和関数テクスチャも,そうした情報を含むことになる。
なので,そのシーン全体に降り注ぐ,太陽光のような平行光源による照明効果がもたらす表面下散乱だけでなく,シーン内に設置されたさまざまな局所光源による表面下散乱効果も得られる。
夜間のシーンでは,半透明鉱山に映える発光植物の光が,半透明の岩肌に浸透する。また,これが散乱して再び出射するような鈍い照明効果が,特別な処理をすることなく,システム的に自動で得られるのだ。
マクラーレン氏:
この,「半透明地形が自ら発光して,これが周囲を照らしつつも,半透明地形の中で散乱する」表現も簡単に行えました。
どれくらい簡単かと言うと,ただ,半透明地形の界面下に光源を設置するだけ。
VCTシステム上から見れば,これは,シーン内に設置されている光源が地形の内部なのか外なのかの違いでしかない。なので,VCTシステム上から特別な処理を行う必要はない。球面調和関数テクスチャの生成にあたっても,特別な措置は不要なのだ。
そしてその処理の結果としては,半透明地形内部の光源がその内部で散乱して鈍く発光し,それらが周囲も照らし,さらに,その周囲にも光を浸透させて散乱し,鈍く輝かせるといった効果が得られるのである。
球面調和関数テクスチャ応用事例(2)〜映り込み表現への転用
開発チームは,球面調和関数テクスチャが,シーン内の各ボクセル構造において,全方位に向けた粗い照明情報を所持していることを,映り込み(Reflection,リフレクション)表現に応用できるのではないかとも考えた。
The Tomorrow Childrenのレンダリングシステムが,各ピクセルの陰影計算にVCTシステムを使っていることは前編で長々と解説したたわけだが,そこで出てきた「16方向に円錐状の情報回収プローブを発射し,照明情報を回収して行うライティング要素」は,照明効果のうち,主に拡散反射に関するものであった。
より説得力の高い,見栄えのいい材質陰影表現を行うためには,鏡面反射要素(項),すなわち映り込み要素をも解決しなければならない。
それに,この球面調和関数テクスチャを活用するというわけだ。
この計算は,VCTではなく,視線反射方向のレイマーチングで行う。
レイマーチングとは,言ってしまえば,レイトレーシングのようなものだ。レイ(Ray,光線)を少しずつ進ませて(=マーチングさせて),一歩進むたびに「オブジェクトに衝突したかどうか」を判断しつつ,情報を回収するような仕組みである。
視線反射方向にレイを投げて,その方向にある球面調和関数テクスチャの情報を回収してはレイを進めて……を繰り返し,そこから回収できた全情報を鏡面反射項の計算に活用するというのが基本方針になる。
ただ,レイマーチングは処理負荷が高い。とくに,広大なゲームシーン内をレイマーチングさせるのは時間がかかりすぎる。
マクラーレン氏:
そこで,我々はレイマーチングを高速化するために「Signed Distance Field」(サインドディスタンスフィールド,以下 SDF)を生成することにしました。SDFの生成には「Jump Flooding Algorithm」(ジャンプフラッディングアルゴリズム,以下 JFA)を採用しています。
ここでまた新しいキーワードが登場したので解説が必要だろう。
SDFは,着目している地点から探査対象までの最短距離を格納したテクスチャ(データテーブル)のこと。日本語で言えば「符号付き距離場」といったところだ。
SDFは,レイマーチングを高速化するのには適したデータなのだが,その概念は,下の図を見てもらったほうが分かりやすい。
SDFとは,着目している地点から探査対象までの最短距離を記録したデータテーブル。この図では,各グリッドの中心点から樹木までの最短距離を求めている |
レイマーチングを行うとき,「レイの歩幅」の決定にSDFを用いる。「いまレイがいるグリッド」に対応するSDFには,探査対象までの最短距離が書かれているので,その距離でレイを進めれば,探査対象を貫通することのない,最も長い歩幅で高効率にレイを進められることになる |
一方のJFAは,探査対象の個数や密度に依存しない,広い空間を効率よく探査するためのアルゴリズムだ。
JFAは,「Jump拡張したFlooding Algorithm」なので,それぞれ,分けて説明したほうがいいだろう。
Flooding Algorithmの応用先で最もイメージしやすいと思われるのは,ペイントソフトにおける「ある起点から輪郭線を探しつつ色を塗り潰す」ための輪郭線探査だ。
塗り潰しにあたって,起点となるピクセルから洪水(Flooding)を起こさせるように輪郭線の探査範囲を広げていくのが,最も直接的なFlooding Algorithmアプローチとなるが,これでは処理系がシーケンシャル(順次)手法すぎてマルチスレッド実装しづらい。言い換えると,GPUでの実装に適さない。
そこで,JFAでは,一定距離ジャンプ(Jump)させたところから,同時並列的に探査を行うのだ。
より実装レベルに近い解説は,シンガポール国立大学Rong Guodong氏による論文「Jump Flooding Algorithm on Graphics Hardware and Its Applications」(※リンクをクリックするとpdfファイルのダウンロードが始まります)を参考にしてほしい。
というわけで,The Tomorrow Childrenでは,JFAを活用してシーンのSDFを生成し,この情報を基にレイマーチングを行い,球面調和関数テクスチャの情報を回収して,鏡面反射および映り込みの表現に応用しているのだ。
マクラーレン氏:
SDFは2つ生成しています。1つは地形とオブジェクトまでのSDF。もう1つは動的光源までのSDFです。
こうした鏡面反射および映り込みの表現として近年流行している手法に,「Screen Space Reflection」(スクリーンスペースリフレクション,以下 SSR)があることを知っている人も多いだろう。
SSRはレンダリング結果とそのレンダリング結果として残った深度(Z)バッファを活用して,画面座標系の局所的レイトレーシングを行うテクニックだ。実際のところ,SSRのほうが,鏡面反射および映り込みの解像感では,The Tomorrow Childrenにおける手法より優れているかもしれない。
しかし,The Tomorrow Childrenにおける手法にはSSRにはない独特なメリットがある。
マクラーレン氏:
SSRは画面座標系のテクニックですから,画面外にある情景については手の施しようがないんです。しかし,我々の手法なら,視線からは直接見えていない情景の映り込みも反映させることができます。
下のムービーを再生してみてほしい。
これは,オブジェクトの上部で炎がメラメラと燃えている状況なのだが,手前の球体側に,燃える炎の映り込みが見えている。炎の本体が視点位置からは見えていないときにも安定的に映り込んでいるのが分かるだろうか。SSRだと,こうした表現は実現できない。
最近のゲームグラフィックスでは,SSR的な技法を屈折表現に応用する事例があるが,The Tomorrow Childrenにおけるこの技法も当然,そうした方向への応用が可能だ。
SSR的屈折表現では,画面の外にあるオブジェクトが屈折して見えることはないが,レイマーチングベースの技法ならそれも実現できる。
下のムービーはその事例だ。
画面外の情景や,視点からは遮蔽されているオブジェクトの屈折像がガラス材質越しに見えているのが分かるだろうか。
こうして見てくると,影やパーティクル表現,表面下散乱,映り込みなどといった表現のすべてが,従来のゲームグラフィックスにおける実現法とは異なっていて,しかも,独自のレンダリングシステムであるVCTと深く連動しているのが分かると思う。
中編はここまで
前編に勝るとも劣らぬほど難解だったかもしれないが,ひとまず,中編はここまでとなる。
とにかく,The Tomorrow Childrenのグラフィックスエンジンは,現在主流のものと比べて,かなり進んだ実装になっている。そのため,構成要素のほとんどが新しい。
もしかすると,本作の手法が将来のゲームグラフィックスの主流になってくる可能性もあるので,今のうちに予習しておく価値はあるとは思う。
さて,最後となる後編は,本作のゲームメカニクスに大きく貢献している,動的な地形システムにまつわる話題が中心となる予定だ。
最後はこれまた難解となることだろう。今度はそう間を置くことなく掲載できるはずだ。
西川善司の「試験に出るゲームグラフィックス」(4)レイトレアプローチで作り上げた「The Tomorrow Children」の先進ビジュアル,前編
PlayStation.comのThe Tomorrow Children公式ページ
キュー・ゲームス公式Webサイト
- 関連タイトル:
The Tomorrow Children
- この記事のURL:
キーワード
(C)Sony Interactive Entertainment Inc.