イベント
[CEDEC 2012]「GRAVITY DAZE」のグラフィックスエンジン詳説。いかにしてSCEはリッチな画面効果と30fps動作をVita上で両立させたのか
CEDEC 2012の2日めとなる8月21日に実施されたセッション,その名もズバリ「バンドデシネの世界を掌に 『GRAVITY DAZE/重力的眩暈:上層への帰還において、彼女の内宇宙に生じた摂動』のグラフィックスエンジン解説」では,ソニー・コンピュータエンタテインメント(以下,SCE)のプログラマー自らがグラフィックスエンジンの技術解説を行ってくれたので,今回はその内容をレポートしたい。
- 関連記事1:[CEDEC 2012]“Too Japanese”だから受け入れられた「GRAVITY DAZE」の制作手法。プロデュースとシナリオから見る海外で評価される考え方
- 関連記事2:[CEDEC 2012]短期間,少人数で新規IPの背景美術を完成させたマネジメント。「GRAVITY DAZE」,“Living BackGround”を考慮したワークフロー
オープンワールドを30fpsで描ききる
立役者となる,2段構えのカリング処理
具体的な数字を挙げてみると,GRAVITY DAZEのゲーム世界は垂直に±7km,水平に±1km。しかも主人公は周囲の重力を自在に操れるため,この世界を自由に飛び回り,好きな場所へ着地できる。地面に足を付けているだけの,従来的な三人称視点のゲームとは様相が異なるのだ。
さらに,ゲーム世界に配置されるオブジェクトには破壊可能なモノが多い。すなわち動的オブジェクトが多いということである。
そこでGRAVITY DAZE開発チームは,3Dモデル単位のアグレッシブなカリングメカニズムを実装することを決断したのだという。
ちなみに,今日(こんにち)的なゲームグラフィックス描画において,こうしたカリングに対する期待は非常に高くなっている。カリング専用ミドルウェア「Umbra」などが人気を博すほどである。
さてGRAVITY DAZEでは,視点からの視界外(=視錐台外)に外れた3Dオブジェクトを切り捨てる「視錐台カリング」と,他者から遮蔽されて視点からは見えなくなっている3Dオブジェクトを切り捨てる「オクルージョンカリング」の2つを実装している。
視錐台カリングで実装されているのは,3Dオブジェクトをちょうど覆う大きさの直方体「AABB」(Axis Aligned Bounding Box,アクシスアラインド・バウンディングボックス)が視錐台平面,すなわち画面平面の外にあったら,その3Dオブジェクトを描画対象から除外するというメカニズムである。
一方,オクルージョンカリングのメカニズムは少々複雑だ。
まず,背景などの静的3DモデルでZバッファレンダリングを行うのだが,このときにはオクルージョンカリング専用の低ポリゴンモデルを用いる。これは表示用の多ポリゴン3Dモデルだと描画負荷が高いためである。
GRAVITY DAZEではGPUベースのオクルージョンカリングを採用 |
背景用にはオクルージョンカリング専用のモデルを用意。オクルージョンカリング用の深度バッファは256×384テクセルというサイズになる |
このあと「描画すべきか否か」を調べるためのオクルージョン判定を行うわけだが,ここでも表示用の多ポリゴン3Dモデルで判定するのではなく,AABB(≒直方体)でのテストとしている。
そして,遮蔽されているか否かの実質的な判定処理は,「低ポリゴン遮蔽モデルで描画されたZバッファに対して,これから描画する3DモデルのAABBが描画できるかどうか」で行われる。VitaのGPUには,「全ピクセル中の何ピクセルをちゃんと描画できたか(=深度テストをパスできたか)」を返す「オクルージョンクエリ」(Occlusion Query)と呼ばれる可視判定機能があるので,この機能を利用して行うわけだ。
ここでの独特な技術ポイントを2つ紹介しておきたい。
1つは,視点からの深度情報と,シャドウマップに相当する太陽光(=平行光源)からの深度情報の2つをレンダリングしている点である。
「視点からの深度情報」は文字どおり,視点から見て遮蔽されているかどうかの判定のため,「太陽光からの深度情報」は,余計な影生成を行わないためにそれぞれ利用しているという。
ただ,「ある3Dオブジェクトが第三者に遮蔽されていて,その影だけが視界に入ってくる」という場合に,どういったカリングが行われるのかの説明はなかった。こういった特殊な局面でどのようなカリングが行われるかは,残念ながらよく分からない。
もう1つの技術ポイントは,1つのレンダーターゲットに視点からの遮蔽情報(192×128テクセル)と太陽光からの遮蔽情報(256×256テクセル)を生成している点だ。この理由は単純で,複数のレンダーターゲットを用いるとVitaのGPUには荷が重くなり,処理が極端に遅くなるためだ。この特性は,Vita開発者の間では共通認識となりつつある。
SCEによれば,2段構えのカリングを行ったときとそうでないときで性能検証を行ったところ,カリングを行ったときは,行わなかったときと比べて2倍近い性能向上を実現できたとのこと。SCEは,「GRAVITY DAZEにおける30fps達成は,このオクルージョンカリングの効果が大きかった」と振り返っている。
性能検証に用いたシーンがこちら |
カリングなしだと描画対象は5800モデルに |
視錐台カリングによって,2131モデルにまで描画対象を減少させることに成功 |
オクルージョンカリングをさらに組み入れ,367モデルにまで減少させられた |
限られたリソースで
リッチな影を出す方法
GRAVITY DAZEでは,リアルタイム生成される影が非常にリッチで美しいが,携帯ゲーム機の(PCや据え置き機と比較すれば相対的に非力な)GPUで説得力のある影生成を行うために,SCEは実践的な工夫を盛り込んでいる。
具体的には,影生成技法として「Light Space Perspective Shadow Maps」(ライトスペース・パースペクティブシャドウマップ,以下 LiSPSM)を採用しているとのことだ。
LiSPSMはデプスシャドウ技法の進化形にあたり,現行世代の3Dゲームにおいて採用例が非常に多い。
デプスシャドウ技法の「視点から近い位置の影が粗くなる」という弱点を克服した技法としては,「Perspective Shadow Maps」技法というのがあるのだが,これには視点から遠くの影が逆に粗くなるという弱点がある。そこで,遠近両方の影をバランスよく生成できるよう調整した座標系でシャドウマップを生成する技法として考案されたのがLiSPSM法だ。
GRAVITY DAZEにおけるシャドウマップ解像度は1024×1024テクセル。生成した影に対しては近傍比率フィルタリング(Percentage Closer Filtering,PCF)を適用してソフトシャドウ表現を実現している。
なお,このときの影生成負荷を低減すべく,巨大な背景物の影生成には影生成専用の低ポリゴンモデルを用意しているとのこと。一方,主要オブジェクトの影生成においては,オブジェクト表示用モデルをそのままシャドウマップ生成に流用しているという。
一般的に,GRAVITY DAZEのようなオープンフィールド型のゲームでは,複数のシャドウマップを用意しておいて,視点から見て遠距離,中距離,近距離に割り当てるのが普通だ。しかし,VitaのGPUにはそこまでの性能もグラフィックスメモリ容量もないので,シャドウマップは1枚だけとなっている。
しかし,それでは当然のことながら,生成される影の品質は低くなってしまう。そこで開発チームは,独特な工夫と妥協を盛り込むことにしたのだそうだ。
まず,広範囲の影生成を最初からあきらめ,影生成範囲を視点からの一定範囲に限定して,遠距離に向かってフェードアウトさせる工夫を入れた。GRAVITY DAZEの場合,遠方にフォグがかかるのだが,このごまかし方はうまい。
そして,さらにその「一定範囲」も固定ではなく,ある程度の適応型としている。具体的には,前フレームの深度を20×16テクセルの低解像度で取得し,CPUで最遠点を求め,そこまでを影領域に含めるようにしている。言い換えると,「影領域」以外の領域は影生成の処理対象から除外して速度を稼いでいるのだ。
こうした工夫により,キャラクターが壁の近くにいたり,視線を下げて地面を見たりするとき時など,超近距離範囲しか影生成が行われないときなどは,その視界範囲に1024×1024テクセルのシャドウマップが適用されるのでリッチな影生成となるわけだ。一方,視線を上げて遠方までを見渡したときには,その視界範囲に適宜1024×1024テクセルのシャドウマップを割り当て,品質バランスを均一化した影生成が行われていくことになる。
GRAVITY DAZEで採用される
独特なシェーディングモデルを総ざらい
GRAVITY DAZEでは,キャラクターモデルに対して,アニメ風のシェーディングモデルを採用している。
ここで用いられているのは,「ライティングの結果の暗部と中間階調部,明部の3段階に色分けして,間をグラデーションでつなぐ」という,一般的なセルシェーディングモデルだ。
「キャラクターを浮き立たせたい」という演出意図から,ステンシルマスク(stencil mask)を生成して,後段のポストエフェクト処理の影響を受けないようにしているというのが,処理上のポイント。また,背景の影領域に飛び込んだキャラクターに対して,セルシェーディングの効果が落ちてしまったりすることがないよう,ライティングは平常どおり行ったうえでセルシェーディングしつつ,その後でトーンを落とすという独特な処理も行っているという。
また,これらの処理系は「キャラクターのセルフシャドウに対して適用されると不自然と感じられた」そうで,キャラクターモデルに対しては背景からの影投射とセルフシャドウ生成の重複生成をキャンセルしたとのこと。
これは,キャラクターモデル自体の影生成にあたって,AABBの“天井”でシャドウマップを生成することで実現しているという。つまり,セルフシャドウは特定条件下でしか生成されないということでもある。
キャラクターモデルにはアニメ風の輪郭線が出るが,この輪郭生成には,昔ながらの膨張モデル技法が採用されている。この技法はプログラマブルシェーダ時代以前から利用されているもので,採用タイトルの例としては,トゥーンレンダリング採用のFPSとして話題を集めたUbisoft Entertainmentの「XIII」が挙げられよう。
具体的には,3Dモデルの描画時に,当該3Dモデルの各頂点を,法線方向へと微妙に拡大。そのうえで,視点からその3Dモデルを見たときの裏側を黒(=輪郭色)で描画する。その後,3Dモデルを通常描画すれば,膨張させた分だけ輪郭線がはみ出て残るという仕掛けだ。
なお,輪郭線は遠近にかかわらず一定の太さにしたかったそうで,GRAVITY DAZEでは画面座標系の調整を入れているとのこと。この手法だと,視線から見てモデル内部の輪郭線が出ないという弱点があるのだが,そうなっていないことからすると,ピクセルシェーダ側での適応型処理を併用しているのだと思われる。
そのほか変わったところでは,輪郭が不気味に摂動する「敵」の表現において,3Dモデルの各頂点を法線方向に変移させる手法が使われている点も挙げられよう。変位量はあらかじめ用意したノイズテクスチャを基に設定されており,テクスチャをサンプルするときにUVアニメーションを付加することで,不気味な,ぶよぶよと不規則に輪郭が揺れるさまを表現している。
ちなみにこの処理は,頂点シェーダがテクスチャをサンプルする処理系「VTF」(Vertex Texture Fetching,頂点テクスチャリング)によるもの。余談だがVTFは,DirectX 9時代,AMD(当時はATI Technologies)がサポートに反対し,NVIDIAがサポートするという,PC用GPUメーカーの2強で採用するかどうかの意見が割れた機能なのだが,それが今や携帯ゲーム機で普通に利用できてしまうあたりからは,技術の進歩をしみじみと感じる。
もう1つ,疑似的な半透明表現である「ジェムシェーダ」も紹介しておきたい。
これは,GRAVITY DAZEに登場するアイテム「ジェム」の材質表現を行うために作成された特殊シェーダで,不透明パスの描画によって半透明チックな表現を行うものとなっている。
発想はシンプルで,前フレームの内容を保存し,ピクセル単位で法線ベクトルと視線ベクトルを吟味して,前フレームの内容をサンプルするだけだ。正確性は低いものの,法線マップにも配慮した形で反射鏡像や屈折透過のような表現が疑似的に行えるメリットは大きい。
半透明の描画順序という議論以前の,大胆な疑似手法だが,正確性があまり求められない,小さなオブジェクトに対しては十分使えるテクニックだし,なにより半透明描画が苦手なPowerVRには威力絶大なテクニックと言っていいように思われる。
据え置き機品質を実現した
ポストエフェクトの秘密
ここでは,背景オブジェクトを描画するとき視線ベクトルと法線ベクトルとの内積を計算してαチャネルに格納しておき,これに対して(画像処理において古くから活用されるエッジ強調フィルタである)「Sobelフィルタ」をポストエフェクト時にかけるという処理がなされている。
GRAVITY DAZEで印象的な空気遠近表現と空の表現にあたっては,シーンの描画後に得られる深度バッファを参照し,遠方に行けば行くほど「空を表現するグラデーション空テクスチャ」の支配率を上げ,至近距離であればあるほどフォグ色の支配率を上げるような計算で最終色を決定しているとのこと。また,レンダリング結果と合成するときには,同じく深度情報をもとに決定した「視点位置から遮蔽物までの距離に応じた空気濃度」(=空気層の厚さ)に配慮しているという。
つまり,空気層の厚さが薄ければ薄いほど,この処理系で得られたポストエフェクトの効果は薄く,逆に厚ければ厚いほど効果は大きくなるわけだ。空には遮蔽物が当然のことながら何もないため,ポストエフェクトの影響が最大に近くなる。
面白いのは,GRAVITY DAZEだと,フォグの中に埋もれた背景に対しても輪郭線だけは出していること。もちろん,この部分ではマテリアル表現のシェーディングは行われていない。
これは業界的に広く活用されている,川瀬正樹氏(現シリコンスタジオ)のブルームによるもので,一言でまとめると,「レンダリング結果を縮小した物に対し,異なるボカシ径のボカしフィルタを繰り返し適用して,それぞれの途中結果をも合わせて合成していく」という手法。広範囲のボケとボケの中心にある鮮鋭度を両立させるテクニックだ。
Vitaならではのテクニックとしては,単一のレンダーターゲットに対して,ビューポートを工夫することで,異なる領域に結果を出力している点が挙げられる。これによって「レンダーターゲットの切り換えが遅い」というVita(のGPU)の弱点を克服しているわけである。
GRAVITY DAZEはVitaグラフィックスの
ベンチマーク的存在か
今回のセッションでは,GRAVITY DAZEでPlayStation 3などの現行型据え置きゲーム機にかなり近いグラフィックス表現を実現できているという事実の再確認と,それを実現するためにVitaのGPUの短所をうまく隠蔽する,ファーストパーティらしいテクニックが開示されていたように思う。
GRAVITY DAZEのグラフィックスタッチは特徴が非常に濃いので,そのまま採用するわけにはいかないかもしれないが,そこで用いられた技術の数々は「ここまでやってもVitaで30fpsというフレームレートを維持できるのだ」という,よい指標を開発者に示してくれたのではなかろうか。
「GRAVITY DAZE/重力的眩暈:上層への帰還において、彼女の内宇宙に生じた摂動」公式Webサイト
CEDEC 2012公式Webサイト
- 関連タイトル:
GRAVITY DAZE/重力的眩暈:上層への帰還において、彼女の内宇宙に生じた摂動
- 関連タイトル:
PowerVR
- この記事のURL:
キーワード
(C)2012 Sony Computer Entertainment Inc.
(C)2011 Imagination Technologies Ltd. All rights reserved