3Dゲームファンのためのグラフィックス講座
西川善司の3Dゲームファンのための「GRAVITY DAZE」グラフィックス講座(後編)
(2013/2/13 00:00)
「GRAVITY DAZE」におけるユニークな影生成テクニック(1)~1枚のシャドウマップで近景から遠景までの影を高品位に出す方法
「GRAVITY DAZE」の影生成は、デプスシャドウ技法の改良形の1つである「LIGHT SPACE PERSPECTIVE SHADOW MAPS」(LSPSM)技法を採用している。
デプスシャドウ技法は、平行光源の位置を視点として深度バッファレンダリングを行なって作り出す「シャドウマップ」を用いて影生成を行なう事からシャドウマップ技法とも呼ばれるテクニックだ。
シャドウマップには、光源位置から見たシーン内の各オブジェクトまでの距離分布をテクスチャ化したものに相当する。換言すれば、これは、光源位置から放たれた光が「どこまで到達して遮蔽されたのか」の情報分布となる。
実際の最終レンダリング時では、このシャドウマップを参照して、レンダリング対象ピクセルが「光に当たっているか」を検査し「YES:影でない」、「NO:影である」と判定しつつ描画を行なっていく。
デプスシャドウ技法によって生成された影は、視点から近いほど粗くなる傾向があるため、これを改善すべく編み出されたのが、「PERSPECTIVE SHADOW MAPS」(PSM)技法で、これは視点から見て近い位置ほどシャドウマップ解像度が上がるように、シャドウマップを、視界からの座標系、すなわち透視投影(Perspective Projection)した状態で生成するという改良を加えたものだった。
ところが、PSMでも、光源位置と視線方向の組み合わせがワーストケースに陥ると、PSM技法の効果がスポイルされることがあった。そこで、PSMに対し、光源位置からのシャドウマップ生成に際して、シャドウマップの解像度が、視界から見た時に近景から遠景までがより均一化するように、光源側の座標系を操作する工夫が盛り込まれた。これがLSPSMだ。詳細については筆者連載のバックナンバー
「3DゲームファンのためのXbox 360グラフィックス/物理エンジン講座 Xbox 360用ゲームライクテクニカルデモ『妖精の棲む』の秘密」を参照して欲しいが、LSPSMは「ロストプラネット」シリーズ、「ソニック ワールドアドベンチャー」、「ストリートファイターIV」シリーズなどに採用されており、近年では、かなり定番化した技法になっている。
「GRAVITY DAZE」では、この技法のキモでもあるシャドウマップ生成の際のGPU負荷低減のために幾つかの工夫を盛り込んでいる。1つは建物などの背景オブジェクトに関しては、影生成専用の低ポリゴンモデルを用意しており、これでシャドウマップを生成している。この影生成専用低ポリゴンモデルは、実際に描画する実体モデルから大幅にポリゴン数を低減させたものになっており、たとえは数千ポリゴンでモデリングされた建物であれば、数百ポリゴン程度にまで削減を行なったものになっているという。
山口由晃氏:背景の影はシルエットとしてそれなりの形状をしていれば十分なので、例えば建物の影生成専用モデルは、描画用実体モデルのディテール部分は全てなくしています。ただ、キャラクターモデルに関しては影生成専用の低ポリゴンモデルは用意しておらず、描画用実体モデルそのままを用いて影生成を行なっています。
「GRAVITY DAZE」のシーンに登場するオブジェクトのうち、一般的なオブジェクトは、地形、建物、窓といった構成物がひとつひとつ独立したモデルとして個別に扱われている。しかし、「消失しない/動かない/変形しない」静的なオブジェクトの影生成用モデルは、最適化のために、それらの構成物を1モデルに統合した上で簡略化している。逆に、看板、ドラム缶、椅子といった大道具、小道具的なオブジェクトは破壊されたり移動したりする可能性があるため、この統合簡略化された影モデルには含まれない。
影生成負荷低減に際しての工夫のもうひとつは、前編でも触れたカリングを光源位置からの視界に際しても適用しているという点だ。影生成専用モデルがいくら低ポリゴンモデルとは言っても、とてつもない量がGPUに入力されては困る。シャドウマップは光源位置からの深度バッファレンダリングになるので、光源位置から見て遮蔽されている3Dモデルの排除を行なって、シャドウマップ生成時に無用な影生成専用低ポリゴンモデルレンダリングを抑えるのである。
シャドウマップ解像度は1,024×1,024テクセル。生成した影の輪郭のジャギー低減は、GPU側に用意された2×2サンプルの近傍比率フィルタリング(Percentage Closer Filtering:PCF)によって行なわれる。
「GRAVITY DAZE」は、オープンワールドタイプのゲームなので、かなり遠景までが広い視界が描画される。となれば、単一のシャドウマップによる影生成はいくらLSPSM技法とは言え力不足だ。本来なら、複数のシャドウマップを近景・遠景に割り当てるなどするカスケード改良手法を導入すべきなのだが、PS Vitaという携帯ゲーム機のスペックではその選択は現実的ではない。そこで開発チームは、またもや独創的なアイディアは立案し、この「負い目」を隠しながら高いクオリティをプレーヤーに感じさせることに取り組んだ。これは負荷低減と実践と、携帯ゲーム機のスペックハンデを克服しつつ見た目の品質を上げるための一挙両得的な工夫といえる。
まず、その単一シャドウマップによる影生成を、視点から見てある一定距離内(100m)に限定するという大胆な割り切りを導入した。ただ、このままでは、その“一定距離”の所に影あり、影無しの境界が露呈してしまうことになるので、描画する影をその境界線に向けてフェードアウトしていくような描画スタイルにしている。
いずれにせよ、“一定距離”より奥の情景には影がでないことになるのだが、遠景は後述するフォグエフェクトによる効果で淡い見映えになったり、線描のみのシルエットのみに落ち込んだりさせているので、意外に「遠景に影がない」と言うことが気にならない。というか、この事実に気がつかない人も多いだろう。
宮前雄生氏:LSPSM技法は視線の方向と、影生成元の光源の向きが近いときには影の品質が落ちてしまう特性があります。例えば、太陽として設定した平行光源が天球ににあって、地面に向けて光が降り注いでているわけですが、この時、プレーヤーキャラクターが地面方向にうつむいた時は、光源からの光の向きと視線の向きとが近くなります。この時、影の品質が落ちてしまうんです。そこで立案したのが、カメラのオートフォーカスのようなイメージで、深度バッファをCPUでサンプルして、最遠点を求め、ここを影生成領域の最遠境界とする工夫です。
PS Vitaは、PS3のようにCPU直轄のメインメモリとGPU直轄のグラフィックスメモリの2タイプのメモリがあるが、アドレッシングは共通であり、CPU、GPUは互いに相手側のメモリ領域に透過的にアクセスが可能になっている。そこでレンダリング完了後の深度バッファに対し、CPUでアクセスして最遠点を求め、その最遠点が前述した影生成領域境界より近い場合に限って、影生成領域境界をそこまで近くする調整をするのだ。
この工夫を入れたことで、プレーヤーキャラクターが地面方向にうつむいた時には、直近の地面までの領域に対して1,024×1,024テクセルのシャドウマップで影生成が行なえるようになり、当然、生成される影の品質は向上することになる。非常に賢いテクニックだ。
なお、CPUによる深度バッファへの最遠点探査は、20×16ポイントの傾斜サンプルパターンによるポイントサンプルで実践されている。サンプルパターンを傾斜パターンにしているのは、建物の隙間などに対する最遠点獲得精度を上げるためだとのことだ。
CPUによる深度バッファへの最遠点探査は、「レンダリング結果として残る深度バッファへの探査」になる。つまり、最遠探査結果は1フレーム前に対して行なったことになるので、この処理系によって制御される影生成領域調整は1フレーム遅れで行なわれることに他ならない。であるため、急速な視線移動を行なった時には、この影生成領域調整がプレーヤーに露呈してしまう可能性がある。
そこで、実際の影生成の最遠境界は、CPUによる最遠点探査で求められた最遠点よりも常に若干遠くにするようにし、リアルタイム影生成領域調整によって影生成の最遠境界が近くなる際には、境界更新をわざとゆっくりとさせている。逆に、リアルタイム影生成領域調整によって影生成の最遠境界が遠くなる際には、影の描画範囲が広くなったときにその境界部分をユーザーに目撃される可能性があるので、境界更新をすぐさま行っている。
「GRAVITY DAZE」におけるユニークな影生成テクニック(2)~セルフシャドウのキャンセルと相互投射影の両立
「GRAVITY DAZE」では、キャラクターモデルに対してはセルフシャドウ(自己遮蔽による影)を出していない。
横川氏:バンデシネテイストのキャラクター達のテイストと合わなかったことと、LSPSMを使っているとはいえ、単一シャドウマップによるセルフシャドウでは品質的に満足がいかなかったためです。ただし、建物からの影などはちゃんとキャラクター達に投射されます。
セルフシャドウをキャンセルするもっとも単純な方法は、キャラクターモデルのレンダリングに関してはシャドウマップへの参照を取りやめることだ。しかし、建物などの他者が落としている影はキャラクター達に投射してやりたいということになると、シャドウマップを参照して影を出す必要がある。シャドウマップにIDでも一緒にレンダリングすればセルフシャドウだけをキャンセルすることもできるだろうが、いずれにせよ一筋縄ではいかない。
この両立が難しい要求仕様に対し、開発チームはここでも独創的なアイディアで対応した。それは、そのキャラクターをちょうど覆う大きさの直方体「AABB」(Axis Aligned Bounding Box)上の点でシャドウマップを参照して影生成を行なうというテクニックだ。
具体的には、キャラクターモデルをレンダリングする際は、そのレンダリング対象ピクセルと平行光源位置を結ぶ線がAABBと交叉する点上からシャドウマップを参照して「影か否か」判定をするようにする。
このシャドウマップ参照手法だと、キャラクターモデルの自己遮蔽は参照されない(=参照できない)が、AABBに投射してくる他者の影はキャラクターに出すことはできることになる。キャラクターモデル視点で考えると、自分の身体の外に投射されている影を自分のところに転写しているようなイメージだ。自分身体の外で影生成判定を行なっているわけなので、セルフシャドウは出るわけがない。しかし、シャドウマップは参照しているので、他者が落としている影の影響はちゃんと反映させることができるのだ。
山口氏:さらにいうと、実は、キャラクター達については、たとえ建物の影の中に入ってしまっても、バンデシネシェーダーの3階調陰影を出して、立体的な陰影が維持されるような工夫を盛り込んでいます。
例えば、現実世界において、昼間、自分が建物の影の中に入ったとき、太陽からの直接光を浴びることはない。当たり前だ。空からの光や、地表に充満する多様な間接光からの影響を受けるだけだ。
この点、「GRAVITY DAZE」では間接光照明(大局照明)技術を適用していないため、何か対策しないと、キャラクターモデルが建物の影の中に入った瞬間から、そのキャラクターに適用されているカラーテクスチャがただ見えるだけの、のっぺりとした描画になってしまう。
そこで「GRAVITY DAZE」では、建物の影に入っていようがいまいが、とにかく平行光源(太陽)からのライティングは行い、シャドウマップ参照を経て影判定を受けた箇所については輝度を落とすというシェーディングを行なっている。これにより、キャラクターは影の中に入ってもバンデシネシェーダーの3階調陰影の効果は出続けることになり、影の中にいてもキャラクターグラフィックスがのっぺりすることがないのだ。