2016年10月22日土曜日

リフレクションプローブ


Unity5でリフレクションプローブ(ReflectionProbe)を使うメモ。

使用環境:Unity5.4.2f1

どんなことができるか

室内において、金属などの反射オブジェクトの映り込みを調整したい場合等に有効。

通常反射物は室内でもスカイボックスの影響を受けてしまう。
(基本的にスカイボックスはシーン上のオブジェクトすべてに影響する為)。


そのような際にリフレクションプローブを配置することで室内の風景を映り込ませることで解決できる。
他、車が空下からトンネルに入った際などの映り込みの切り替えなど。



リフレクションプローブ概要

リフレクションプローブを置いた地点から360度視界のCubemapを内部で自動生成してくれる。
Cubemapはスカイボックスで使われている6面ボックスのマップと同じ概念で、自分でCubemapを指定することも可能。
Cubemap生成範囲は指定可能なので部屋の壁、床、天井などを範囲に設定すると良い感じ。

あたかも部屋専用のスカイボックス=Cubemapがあるようになる(ただし実際にシーン上では見えない)。

リフレクションプローブの有効範囲内にあるオブジェクトは、先のCubemapが映り込むようにできる。
結果的に部屋内の景観(壁、床、天井、置物類)が映り込むような状態にできる。

映り込み先の(反射する)オブジェクトは移動するものでも可。

リフレクションの種類指定は3つでコンポーネントのTypeで指定。
  • Baked
    事前に設定されているリフレクション空間から静的な(映り込ませ用の)Cubemapを自動生成してくれる。ただし映り込む周囲景観オブジェクトはstatic限定。
    しかしその分軽量でモバイルでも使える可能性がある。
  • Custom
    ユーザが用意したCubemapを手動で指定できる。
  • Realtime
    static以外の周囲景観オブジェクトも映り込む。動的にCubemapを生成することになる為、負荷は上がる。

主にBakedを使うことが多くなりそうな気がします。 


リフレクションプローブ設置手順(Baked)

リフレクションプローブの設置と設定


部屋の中に設置すると仮定して、


Empty Objectを作る。

コンポーネント ReflectionProbe を追加する。

コンポーネント ReflectionProbe のTypeはBakedにしておく。

これを部屋の真ん中付近に置く。
※この置いた地点を中心に360度視点のCubeマップを自動生成してくれるようになる。
※あえて映り込ませたいようなオブジェクトアイテムがある場合はその中心に配置するとそこを中心にCubemapを生成してくれるので良い感じ。
コンポーネント ReflectionProbe でCubemap生成範囲を設定する。
図中#2ボタン押しでシーン内に調整点がでてくるので、それを掴んでドラッグで調整。



映り込む側オブジェクトの設定

部屋の壁、天井、床などの周囲景観として映り込ませたいオブジェクトの設定。

オブジェクトを static に設定する。


映り込まれる側オブジェクトの設定

  • Mesh Renderer
    Reflection Probes: BlendProbes
  • Material
    Shader: Standard シェーダー使用(リフレクションプローブ対応のシェーダー要)
    Reflections: チェック入れSmoothness: 1  ※1に近いほど映り込む。
    Metalic: 1 ※1に近いほど鏡面反射な映り込みになる。





追加補足

・CubemapのBake(?)に結構時間がかかる。
多分CubemapのBakeだと思われますが、生成に結構時間がかかる。
Unityウィンドウ右下ステータスバーにさりげなく進行状況が出てくるのでチェック。
その間もエディタは使えるし再生もできる。ただし再生してもまだ反映されてないので注意。
Bakeが終わるまで気長に待つしかなさそう。
※作業中はいろいろ間引いて高速化は可能だが、最終微調整はどうしても時間がかかる。

・リフレクションプローブが複数ある場合、近い方が優先してブレンド。

・1つのリフレクションプローブだけ映し込みたい場合は、そのオブジェクトの Mesh Renderer の Anchor Override に そのリフレクションプローブのオブジェクトをドラッグ&ドロップする。ないしはプルダウンで選択する。

・映り込ませる(反射)オブジェクトは staticである必要はないので移動できる。
ただし映り込み方に注意(Bakedの場合)。
リフレクション空間に突入すると映り込むようになる。
その際、そもそもリフレクションプローブのボックス6面に事前内部生成したテクスチャをリフレクションプローブの中心点で観測したように映り込ませる様子。
なので映り込まされるオブジェクトは、リフレクションプローブ空間内のどこに移動しても同じように表面に投影されている。つまり位置による補正が無いので周囲の景観具合やまじまじ見るとおかしいのがバレてしまう可能性がある。
ただカメラ視点変化での反射には追従してるので一見するとバレにくい。ここが軽量且つそれっぽくみせるコツかも。

・リフレクションしてるオブジェクトはさらに別なオブジェクトでリフレクションしない
  1. リフレクションプローブの効果で既に反射しているオブジェクトAがあるとする。
  2. その近くにもう1つ同じように反射しているオブジェクトBがあるとする。
  3. この時、オブジェクトBにオブジェクトAは映り込める位置にあるとしても、映り込まない。
映り込みは1世代までみたいです(なので軽量とも?)。この辺は利用時注意。
逆に意図的に「映り込ませない」ような演出にもできるかも?
※Blender等ではこのIllumination映り込みの反射回数指定みたいなのを有効化すると結局レイトレーシング計算していたような記憶。軽量化の為、反射ネスト1回まで演算はうなずけます。それでも結構な演算負荷に見えるので。

サンプルプロジェクト

簡単なサンプルをGitHubにアップロード。
使用環境:Unity5.4.2f1。
https://github.com/maruton/Sample_ReflectionProbe

画面右の「Clone and download」からプルダウン内「Download ZIP」で落とせます。



参考URL: リフレクションプローブリフレクションプローブの使用

この記事では「ユニティちゃん」コンテンツを利用した画像を含んでいます。 © UTJ/UCL




0 件のコメント:

コメントを投稿