読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unity5とSSRで床の反射を表現する、kode80SSR

f:id:tsubaki_t1:20150514232740p:plain

kode80SSRは、Unity5上でスクリーンスペースリフレクションを行うオープンソースのアセットです。

kode80 - Screen Space Reflections in Unity 5

www.youtube.com

SSRは一度レンダリングした結果を元に反射を描画する方法です。描画結果を再利用するので、単純にカメラ2つ置いてリフレクションを作るより良いと思われます。但し、スクリーンにレンダリングした結果を利用する関係上、画面外に描画されているものは描画できません。つまりSSRではスカートの中身は覗けません。スカートの中身も覗きたい場合は、ユニティちゃんライブの反射床やPro向け水面のように、カメラの設定コピーしてレンダリングするのが良さそうです。

f:id:tsubaki_t1:20150515003226p:plain

ちなみにUnity公式でもSSRRを準備しているみたいです。

tsubakit1.hateblo.jp

kode80SSRの使い方

kode80SSRを使う方法は簡単です。

  1. SSRを使いたいシーンを用意します。SSRを適応したいカメラのライティングモードはDeferredに設定します。

    f:id:tsubaki_t1:20150514235903p:plain

  2. kode80/kode80SSR · GitHubよりZipをダウンロードし解凍します。

    f:id:tsubaki_t1:20150514233815p:plain

  3. ダウンロードしたファイルから、「Assets/Scripts」の「SSR.cs」と「SSR.cs.meta」及び「Assets/Resources」を自分のプロジェクトへドラッグ&ドロップしインポートします。

    f:id:tsubaki_t1:20150514234150p:plain

  4. SSRを使いたいカメラ(とりあえずMainCamera)へSSRを追加(Add Component)します。

    f:id:tsubaki_t1:20150514234310p:plain

ちなみに、地面のマテリアル(材質)のSmoothnessが高ければ高いほど反射します。

f:id:tsubaki_t1:20150514234608p:plain

f:id:tsubaki_t1:20150514234617p:plain

SSRの負荷について

さて、ぶっちゃけSSR凄い重いです。どのくらい重いのかを確認するためプロファイラのTimeline(指定フレームの処理実行順や処理時間をタイムライン表示する機能)で確認してみます。

f:id:tsubaki_t1:20150514235627p:plain

拡大

f:id:tsubaki_t1:20150514235344j:plain

ご覧のとおり、ScreenSpaceAmbientOcclusionやDepthOfFieldが霞んで見えるほどの高い負荷を誇ります。特に解像度が高い癖にGPUが貧弱なモバイル環境では、動かすのは割としんどうそうです。

モバイルで反射を使いたい場合は、ReflectionProbeで事前計算したキューブマップを使用して反射を作成するのが良さそうです。

Reflection Probe

反射する物体が静的な物の場合、Reflection Probeを使用する手があります。Bakeで反射情報を事前に取得しておけば、割と低コストで反射の描画を行ってくれます。

f:id:tsubaki_t1:20150515001729p:plain

動く物も反射させたい場合はTypeをRuntimeに設定することでstatic以外も反射に映るよう設定できますが、負荷が上がるので注意が必要です。