Unity5とSSRで床の反射を表現する、kode80SSR
kode80SSRは、Unity5上でスクリーンスペースリフレクションを行うオープンソースのアセットです。
kode80 - Screen Space Reflections in Unity 5
SSRは一度レンダリングした結果を元に反射を描画する方法です。描画結果を再利用するので、単純にカメラ2つ置いてリフレクションを作るより良いと思われます。但し、スクリーンにレンダリングした結果を利用する関係上、画面外に描画されているものは描画できません。つまりSSRではスカートの中身は覗けません。スカートの中身も覗きたい場合は、ユニティちゃんライブの反射床やPro向け水面のように、カメラの設定コピーしてレンダリングするのが良さそうです。
ちなみにUnity公式でもSSRRを準備しているみたいです。
kode80SSRの使い方
kode80SSRを使う方法は簡単です。
- SSRを使いたいシーンを用意します。SSRを適応したいカメラのライティングモードはDeferredに設定します。
-
kode80/kode80SSR · GitHubよりZipをダウンロードし解凍します。
- ダウンロードしたファイルから、「Assets/Scripts」の「SSR.cs」と「SSR.cs.meta」及び「Assets/Resources」を自分のプロジェクトへドラッグ&ドロップしインポートします。
- SSRを使いたいカメラ(とりあえずMainCamera)へSSRを追加(Add Component)します。
ちなみに、地面のマテリアル(材質)のSmoothnessが高ければ高いほど反射します。
SSRの負荷について
さて、ぶっちゃけSSR凄い重いです。どのくらい重いのかを確認するためプロファイラのTimeline(指定フレームの処理実行順や処理時間をタイムライン表示する機能)で確認してみます。
拡大
ご覧のとおり、ScreenSpaceAmbientOcclusionやDepthOfFieldが霞んで見えるほどの高い負荷を誇ります。特に解像度が高い癖にGPUが貧弱なモバイル環境では、動かすのは割としんどうそうです。
モバイルで反射を使いたい場合は、ReflectionProbeで事前計算したキューブマップを使用して反射を作成するのが良さそうです。
Reflection Probe
反射する物体が静的な物の場合、Reflection Probeを使用する手があります。Bakeで反射情報を事前に取得しておけば、割と低コストで反射の描画を行ってくれます。
動く物も反射させたい場合はTypeをRuntimeに設定することでstatic以外も反射に映るよう設定できますが、負荷が上がるので注意が必要です。