【Unity】Light ProbeでDynamicなオブジェクトにも間接光を影響させる

Light Probeを使ってDynamicなオブジェクトにも間接光を影響させる方法です。

Unity2018.3.1

Light Probe?

Unityでライトマップをベイクすると、間接光の影響が反映されるため、
色のついた物体のそばに白い物体が近づくと色づいて見えます。

f:id:halya_11:20190127224009p:plain

しかし間接光の影響はDynamicなオブジェクトには反映されないので、
白い物体のStaticフラグを外すと次のように間接光が影響しなくなります。

f:id:halya_11:20190127224412p:plain

Light Probeを使うと、Dynamicなオブジェクトにも間接光を影響させることができます。

f:id:halya_11:20190127224938g:plain

設定方法

まず検証用にこんな感じのシーンを作ります。

f:id:halya_11:20190127225344p:plain

次に空のGameObjectを作成し、Light Probe Groupというコンポーネントをアタッチします。
するとシーンビューに黄色い点が現れます。この一つ一つがLight Probeです。

f:id:halya_11:20190127225741p:plain

Light Probe GroupのインスペクタからEdit Light Probesをクリックすると編集モードに入ります。
この状態でAdd Probeを押すとLight Probeを追加できます。

f:id:halya_11:20190127225858p:plain

またシーンビューからLight Probeを選択してインスペクタのSelected Probe Positionに座標を入力すると移動できます。

f:id:halya_11:20190127232407p:plain

このように移動と追加を行い、下記のように配置します。

f:id:halya_11:20190127225842p:plain
Capsuleは見づらいのでいったん消しています

次にDynamicなCapsuleオブジェクトのMesh RendererLight ProbesBlend Probesに設定します。

f:id:halya_11:20190127232728p:plain

設定は以上です。
この状態でCapsuleを移動すると、間接光の影響を受けていることがわかります。

f:id:halya_11:20190127224938g:plain

仕組み

Light Probeの考え方としては、まず各Light Probeがその場所の色の情報を持っています。
Dynamicなオブジェクトは周辺のLightProbeの色を取ってきて、自分の位置に応じてそれらの色を補間します。
そしてその色を自身に反映することで間接光を影響させます。

この様子を確認するには、シーンビューでDynamicなオブジェクトを選択して動かしてみます。
すると影響するLightProbeが位置に応じて切り替わっていく様子が見てとれます。

f:id:halya_11:20190127233723g:plain

ちなみにLight Probe1個あたりの情報量としては、RGB各チャンネルに9個のfloat、つまりfloat27個分とのことです。

docs.unity3d.com

この記事で詳しく触れなかった事項

最後にこの記事で詳しく触れなかった事項について書いておきます。

まず、Light Probeを並べる作業はあまり手作業でできる感じじゃないので、スクリプトで行う方法が紹介されています。
実際にシーンを作る際にはこのあたりのツールを作ったほうがよさそうです。

docs.unity3d.com

また、Mesh Rendererの設定をBlend Probesにしていると常に近くのLight Probeを取得するため、
大きいオブジェクトではLight Probe Proxy Volumesという機能を使ったほうが品質が上がるようです。

ただ下記の制約があるようなので、今回は触れないことにしました。
この辺りは使う機会があれば記事を書こうと思います。

コンポーネントには最低でも、32 ビットの浮動小数点形式とリニアフィルタリングを備えた 3D テクスチャのサポートを含む、Shader Model 4 グラフィックスハードウェアと API サポートが必要
Light Probe Proxy Volumes (LPPV) コンポーネント - Unity マニュアル

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com