古典的な3Dビデオゲームの影表現技法
(30fps.net)- 3Dゲームの影は現実のように自動で生じるものではなく、限られた性能の中でそれらしく見えるよう設計される視覚効果である
- 初期の3Dゲームでは、2D画像、足元のblob shadow、ランタイム影テクスチャ、平面投影ジオメトリのような単純だが高速な手法で影を処理していた
- シーンが複雑になるにつれて、投影テクスチャ、shadow map、stencil shadowが使われるようになったが、解像度アーティファクトや誤った表面投影、予測しにくい実行コストといった制約が伴った
- 静的なレベル照明ではvertex colorやlightmapで大きな影を保存しており、現代のゲームでもCascaded Shadow Maps、light probes、capsule shadowsのような伝統的手法の派生形が引き続き活用されている
- レイトレーシングによる影はより自然な方向性だが、Alan Wake 2のような複雑なシーンではサンプリングやdenoiserに依存しており、依然としてトレードオフが画面の性格を決定している
ゲームの影は現実とは異なる作られ方をする
- 現実の影は光が遮られた結果であり、単一光源が遠くにある場合、複数の影が重なってもそれ以上暗くはならない
- 3Dビデオゲームでは影は自然には存在しないため、開発者が性能と視覚的な説得力の間で直接設計しなければならない
- Metal Gear Solidのblob shadowのように、ゲーム内では影が重なるほど暗くなる表現も可能である
画面上に直接描く2Dの影
- 最も単純な方法は、キャラクターを描く前に画面上へ2Dの影画像を先に描くことだ
- Winter GoldとMDKは、スケーリングなしのアニメーション2D影画像を使っている
- キャラクターが他のすべてより手前にある場面では、この単純な方法でもうまく機能する
Blob shadow: 足元の暗い円
- 3Dで最も単純なアプローチは、キャラクターの下に暗い円盤を描く方法である
- Super Mario 64はキャラクターにblob shadowを使用しており、Nintendo 64のハードウェアdecal機能によって影が床面にのみ見えるよう、実質的にクリッピングしている
- blob shadowは状況に応じてアニメーションさせることができる
- Super Mario 64ではジャンプすると影が小さくなる
- Metal Gear Solidでは影の形が変化する
- 影が崖の外にはみ出す問題は、blob quadをdecalのように投影する方法でも扱える
レンダーテクスチャベースの平面影
- blobが単純なテクスチャなら、ランタイムにキャラクターを上からレンダリングして影テクスチャとして使うことができる
- Crash Bandicoot: Warpedはランタイム影テクスチャで良い結果を出している
- Soldier of Fortuneも同じ方式を使うが、影の解像度が低いため結果はあまり良くない
- この方式は、光の視点からdepth mapを作るshadow mappingとは異なる
- ここでは白黒画像をテクスチャとして使う
- 1ビットshadow mapに近い概念である
ジオメトリで作る平面影
- 直感的な方法は、影を落とす物体を光と逆方向に平面へ押しつぶすように投影し、同じ物体を黒色で1回余分にレンダリングすることだ
- この影は通常不透明のままにして、物体の一部どうしが重なって描かれる問題を隠す
- 平らな床ではよく合うが、複雑な地形では精度が落ちる
- F-19 Stealth Fighterは滑走路上に飛行機の影を描いている
- GLQuakeベースのゲームでも平面影を見ることができる
- Kingpin: Life of Crimeは黒い平面影を無難に使っている
- Half-Life alpha 0.52では透明度の問題が表れている
地形上の平面影
- David BrabenのVirusでは、宇宙船が地形の上に真上から見下ろした影を落とす
- Interstate ’76は地面の傾斜に合わせて平面影を傾けて引き伸ばす
- 影がときどき地面を貫通する
- 全体としてはかなり説得力がある
- ソフトウェアレンダリング画面ではやや半透明の影が見え、ハードウェアアクセラレーション画面では完全な黒い影になる
- Interstate ’76は橋のような大きなオブジェクトの影投影も試みたが、結果は完全な成功とは言えなかった
投影テクスチャによるdrop shadow
- 投影テクスチャ方式では、上で作った影テクスチャを平面ではなくさまざまな形状の表面に投影する
- 概念的には、Bat-Signalを空から下へ照射するのに近い
- Toy Story 3: The Video Gameはこの方式の例であり、影が別の影と重なるとさらに暗くなる
- 非常にくっきりした影を作れるが、表面条件に敏感である
- 垂直な表面では不自然に見えることがある
- 場合によっては天井にも現れることがある
- Sonic Adventure 2: Battleのゲームプレイ映像でそうした例を見ることができる
- オブジェクトを突き抜けて見えることがあるため、特殊なケースにより適している
- 木の影にも有効な場合がある
Shadow map: 事実上の標準方式
- shadow mapは、ゲームが光の視点から深度画像を描き、ワールドをレンダリングするときにその画像を参照して影を判定する方式である
- 通常のレンダリングコードを再利用できるため、比較的実装しやすい
- 限られた解像度は「Peter Panning」や「shadow acne」といったよく知られたアーティファクトを生む
- カメラに近い表面へより多くのshadow map領域を割り当てようとするさまざまな手法が提案されている
- 見栄えの良い結果を得るには通常チューニングが必要である
Stencil shadow: くっきりしているが高コストな方式
- stencil shadowはどんな表面にもくっきりした影を描くことができ、shadow mapでは再現しにくいフィルム・ノワール風の雰囲気を作り出す
- 代表例は暗い部屋で有名なDoom 3である
- この方式では、見えないジオメトリであるshadow volumeによってワールドを光の当たる空間と影の空間に分ける
- ゲームはshadow volumeの中にないピクセルにだけ照明を適用する
- 動作にはワールドを何度も描く工程が必要になる
- まずワールド全体をambient lightingで描く
- 各lightごとにshadow volumeを描き、その後ワールドを再度描いて影の外側のピクセルだけが影響を受けるようにする
- front faceとback faceに異なるstencil operationを設定する
- 商用例として可能な限り早いものの1つにSeverance: Blade of Darknessがあり、2001年に優れた影を見せていた
- 現在あまり使われない理由の1つは、実行コストの予測が難しいことである
- コストは画面上でshadow volumeがどれほど大きく見えるかによって大きく変わる
- 最適化されたアルゴリズムには特許が存在した
- Doom 3についてId Softwareが何らかの合意に達したとみられる関連リンクがある
柔らかいstencil shadow
- stencil shadowは必ずしも鋭くある必要はない
- Silent Hill 2はPlayStation 2でstencil shadowを描いた後にブラー処理を行い、柔らかい影を実現している
- コンソール上での結果はほぼ完璧に見える
単純化したキャラクター影
- 画面に表示されるモデルより単純なモデルに影を落とさせることができる
- Nintendo 64のZeldaでは、Linkの足だけが影を落とし、他の部分はそうならない
- Hyperbladeは、未来的なホッケー競技場でプレイヤーが単純なアニメーション形状の平面影を落とすという独特な方法を使っている
静的なレベル照明に含まれる影
- vertex colorとlightmapはゲームレベルの照明を保存する技法であり、多くのゲームで大規模な影を見せる唯一の方法として使われてきた
-
Vertex color
- Icoは古いper-vertex lightingだけでも精巧な影を作れることを示している
- low-polyマップでは鋭い影もvertex colorで表現できる
- Tony Hawk Pro Skater 2はこの単純な方式でも印象的な結果を出している
-
Lightmap
- lightmapはレベルの照明と影を保存する古典的な方式である
- 頂点ごとに色を保存する代わりに、照明だけを表す第2のテクスチャセットを使う
- 領域ごとに解像度を変えられるため、必要な場所でより正確な影を作れる
- vertex colorよりも多くのメモリを使用する
- Quakeはlightmapを普及させたゲームとして挙げられる
現代のゲームでも使われ続ける伝統的手法
- 現代のゲームでも状況に応じて伝統的な影技法が引き続き使われている
- shadow mappingの派生であるCascaded Shadow Mapsは、広い領域を高速にカバーするために使われる
- lightmapはlight probesのような他の手法と組み合わせて使うことができる
- Call of Dutyもlightmapを使用している
- 関連事例はHemispherical Lighting Insightsのスライドにある
- 単純化したキャラクターモデルという考え方も受け継がれている
- The Last of Usは引き伸ばした球体で柔らかいキャラクター影を作る
- Unreal Engineはキャラクター向けのcapsule shadowsをサポートしている
- 投影影もいまなお使われている
- Hot Wheels Track Attackはshadow meshをテクスチャとしてレンダリングした後、レーストラックに投影する
- 開発者ブログの説明とゲームプレイ映像で確認できる
レイトレーシングの影も完璧ではない
- 物理的に正確な照明をシミュレートしようとするゲームでは、光のない場所に影が自然に現れる
- shadow mapと違って、小さなジオメトリのディテールも正確な影を落とせる
- 大きなランプは自然な柔らかい影を作り、間接光は暗い角を明るくできる
- この目標を現実にするため、レイトレーシングアルゴリズムとハードウェアには多くの時間とコストが投入されてきた
- 実際の現代ゲームのシーンは非常に複雑であり、シミュレーションを近似しなければならない
- Alan Wake 2のray-traced shadowsでは、各ピクセルがランダムに選ばれた単一のlightからしか照明を受けない
- 結果はdenoiserに送られ、ノイズのある画像を知的に平滑化する
- レイトレーシングの影も完璧ではなく、選ばれたトレードオフに応じて固有の見た目が生まれる
影を使わないという選択
- ゲームによっては影より他の要素を優先することがある
- 影を実装しないことも明確な選択肢になりうる
1件のコメント
Hacker News のコメント
目の錯覚や芸術的な雰囲気ではなく、空が青く晴れている日の影は、空から反射した光に照らされるため青く見える。
車の下を見ると、空が見えている部分にははっきりした青い影があり、車体が空の光まで遮る場所に近づくほど、本当の黒に近くなっていくのが分かる。
この鮮やかな青い太陽光の影に、柔らかく黒いAO の空の影を混ぜると、低コストでかなりきれいな影を作れる。
優れたグラフィックスレンダリングエンジンなら、こうした処理をしている。影には空色の弱い色味があるべきだ。
だから昔の No Man's Sky のスクリーンショットの一部が気になった。空は緑なのに、影が紫の場面を見た気がする。
古典的な塊状の影のように、ジャンプ後にどこへ着地するかを見積もれるようにしつつ、きちんとした影の視覚品質も保っている。
記憶が正しければ、暗い環境では影を床より明るくして、見え続けるようにすることもある。
そうすると、プレイヤーモデルがロード/アンロードされるときに影が現れたり消えたりするので、プレイヤーの体が見えているとき以外は影も見えないようにしている。
Valorant は、ローエンドのハードウェアでも非常に高いフレームレートを出すため、意図的にレンダリングを極端に単純化している。動的な影がないだけでなく、動的ライティングもまったくなく、アルファ透明もどこにもない。
普通なら透明に描く煙幕のようなものも完全に不透明に描けるよう様式化しているが、その方が速いからだ。チートと関係なく、性能上の理由だけでも動的な影はどのみち外されていた可能性が高い。
レイトレーシング技術が採用されるにつれて、面光源と柔らかい影が標準になると思う。ハードウェアが許すなら Quake 2 RTX を見てみると、未来がどんなものか分かるはずだ。
最後に、自分のグラフィックス資料リストにこのブログを追加した: https://github.com/aaron9000/c-game-resources
https://www.youtube.com/watch?v=7BvtML5dIuI
PowerVR PCX1 はシャドウボリュームをハードウェアでサポートしており、標準的なステンシルシャドウより効率的に実装されていた。シーンを何度も描画する代わりに、基本的には深度専用のプリパスをハードウェア上でオンチップの深度/ステンシルバッファに対して行い、見えるピクセルを決定し、シャドウボリュームを検査してどのピクセルが影の中にあるか判断したうえで、テクスチャサンプリングとシェーディングを実行していた。
照明の明るさはシャドウボリュームの結果に応じて調整され、見えるピクセルだけをシェーディングするため、オーバードローが不要なテクスチャ fetch 帯域を浪費することもなかった。
PCX1 の後継をベースにした Dreamcast にも、シャドウボリュームを使ったゲームが多かった。Dreamcast の実装はより柔軟で、ボリュームによって照明だけでなく、使用するテクスチャ、UV マッピング、さらには透明ポリゴンのブレンド方程式まで変更できた。
DC で柔らかい影も作ってみたが(https://imgur.com/a/DyaqzZD の最後の部分)、より標準的なステンシル方式に戻って影を複数回描き直すため、フィルレートの負担がかなり大きい。
2 つのランプが 3 人を照らすと、影は 6 つできる。6 つの影がすべて重なる場所は「黒」になるか、環境光だけを受ける。
影の重なりが少ない他の場所では、照度の勾配が生じる。
光源 A の影の中であり、かつ光源 B の影の中なら、どこから光を受けるというのか? 環境光だけで、それもなければ黒だ。
「光源が 1 つだけで、かなり遠くにあるため、影は単に光の不在である」という条件が付いている。
その影は、このゲームにものすごいスピード感を与えた、もう一つの小さな要素だった。
https://imgur.com/a/hOgxr7a
https://www.mobygames.com/game/6233/f29-retaliator/
今でも覚えている瞬間は、夜に裏路地で車を盗んだときだ。プレイヤーキャラクターが車に乗り込むまさにその瞬間、警官が角を曲がって現れ、車を盗むところを「見て」銃を抜くのと同時にヘッドライトが点灯し、動く警官の巨大な影が近くの壁に落ちた。
MGS の影の重なりは完全に間違いというわけではない。環境光、散乱、そのほかのグローバルイルミネーション現象があるからだ。
「Mirror’s Edge(2008、PC)は基本的に Lightmaps: The Game だ」という言い方は笑えるが正しい。当時も印象的なゲームだったし、今見てもそうだ。
当時は不当に過小評価されていたと思う。競合作より短かったからかもしれない。