LAB
研究室
デモプログラム
【分散シャドウマップ】 – Variance Shadow Maps –
いつもは技術デモを公開していますが、今回は内製ゲームエンジン「ヘキサエンジン」について一部を紹介してみたいと思います。
影表現の代表格はPCF(Percentage-Closer Filtering)です。
セルフシャドウ付きソフトシャドウを表現するときに一般的に用いられる手法です。
この手法と双璧をなすのが「分散シャドウマップ」です。海外のゲームエンジンにも採用されていたりして、PCFよりも高速で見栄えも美しいです。
Variance Shadow Maps
http://www.punkuser.net/vsm/
概念については下記ページがわかりやすくて良いと思います。
■3Dグラフィックス・マニアックス 29 影の生成(10)?改良型デプスシャドウ技法(5)
http://journal.mycom.co.jp/column/graphics/029/index.html
この技法は「チェビシェフの不等式」を応用した影のシルエット生成技法です。
式は次のような式になります。
今回は詳細については割愛させていただいて、ヘキサエンジンでの実装例をスクリーンショットで紹介してみたいと思います。
シャドウマップ生成には16bit整数R16G16を使用してレンダリングを行なっています。
精度的にはなんとか足りるということと、32bitフォーマットで高速に動作するということがポイントとなります。
R32G32Fと比較すると2倍以上高速です。又、Zバッファをテクスチャとして読める環境では倍速Z生成を利用可能ですので併用すると効果が高いです。 カラーバッファと併用する際にはZバッファを16bitにするなどしてメモリ帯域を圧迫しない工夫が必要になってきます。
これもリアルタイム性が要求されるゲームだからこその工夫になります。
それにしてもシャドウマップの略称は数が多くて大変です。
今回のバリアンスシャドウマップはVSMと略されますが、他にもPSM, LiSPSM, TSM, LogSM, ESM, CSM, RSM, 等など・・・色々な技法が存在します。
それだけ多様な研究が行なわれているということなのでしょうね。
それぞれの技法に長所がありますので必要な技法を適切に選択して仕事に役立てていくことも大切ですよね。
ヘキサエンジンはPC(Windows環境)・Xbox360・PlayStation3に対応したマルチプラットフォームゲームエンジンです。
ゲーム開発中の画面にメニュー画面などのウィンドウGUIを表示してプレビューや編集、パラメータの変更が可能になっています。
その場で見たままの画面での編集が可能になります。開発を快適に進めることができるようになっています。
さっそくシャドウバッファを表示してみましょう。
今回の例ではバリアンスシャドウマップを平行投影した場合のテクスチャの内容を表示しています。
実装ではカスケードシャドウマップに対応しています。近景・中景・遠景にあわせて解像度の異なるテクスチャを併用して品質を向上する技法です。
【近景】
近くは詳細な遮蔽情報が描画できています。カスケードシャドウマップを使用することで遠景でも品質を損なうことなく解像度感を保つことができます。
ちなみに上図の遠景の小さいスクリーンショットを拡大してみたのが次の図です。
分散シャドウマップだと解像度が下がっても影のエッジが非常に滑らかで綺麗ですね。
シーンに投影されている様子を表示したものがつぎのスクリーンショットです。
わかりづらいかもしれませんが中央にあるものがシーンで、青いグラデーションが視界の視錐台を表しています。白いボックスはテクスチャの投影のされ方を表しています。
バリアンスシャドウマップのメリットは美しいソフトシャドウにあります。
ガウスフィルタと併用したものが次のスクリーンショットです。ぼんやりとした柔らかいシルエットが描画できます。
今回のスクリーンショットでは黒く濃い影表示にしてありますが、本来はこのグレースケールのシルエットが照明の遮蔽項になります。
白いところには照明が当たり、黒い部分には照明が当たらないように計算することで、より正しい照明計算になります。
ヘキサエンジンでは3プラットフォームで同じ結果が得られるように設計・最適化されています。
もちろん各環境は全く異なるものですが、ヘキサエンジン上で開発する場合にはそれを感じさせないような工夫が盛り込まれています。
今後もこのようなかたちでヘキサエンジンを紹介できればと思っています。
CATEGORY
- 製品事例 (7)
- デモプログラム (18)
- プログラムTIPS (41)
- C言語 (5)
- C++ (6)
- C++cording (4)
- Ruby (8)
- VisualStudioの使い方 (3)
- 最適化Tips (5)
- ゲーム開発テクニック (2)
- その他 (7)