【Unity】リアルタイムライトがstaticなオブジェクトに対し、妙に強く反映される問題の解決法
Unity4からUnity5に移行した場合や、他のケースにおいて、realtimeのpointlightが妙に明るくなる事があります。
特にMobile向けに開発している場合、これが発症するケースがあるかもしれません。
下の画像では、地面がstaticな場合と非staticな場合の比較です。ライトのIntensity(輝度)やRange(範囲)は同じなのに、下の画像の方が妙に光を強く反映しています。
staticと言っていますが、実際はこれは「ライトマップが焼かれる」事で発生します。つまり、リアルタイムライトがライトマップに影響を与えている事を意味します。
解決方法はBounce Intensityを0にする事
結論を言えば、この現象はBounce Intensityを0にすれば発生しなくなります。
理由を話す前に話を整理すると、以下の条件で発症します。
- ポイントライトのBounce Intensityが0以外の値を持つ
- ライトの影響範囲内にLightmap Static*1がある。
(≒ライトが焼く対象に設定されている) - LightのPreComputed Realtime GIがOFFに設定されている。
Realtime GIがOFFになると
GIはライトマップに焼かれる
先ほどの発生条件で注目すべきは、Precomputed Realtime GIの存在です。
Precomputed Realtime GIは、リアルタイムなGIの返す方向や色といった情報を事前にベイクしておく仕組みです。
リアルタイムGIとは、リアルタイム光の間接光を表現する仕組みで、PCゲームでは当たり前のように取り入れられてるケースが多い気がしますが、
ただしモバイルゲームではリアルな絵作りが重要ではないケースが多いので、設定がOFFにされるケースが多いです。
これは、単純な光だけでなく、GIを用いた色表現、たとえばリアルタイムなマテリアル光源(下の画像では蛍光灯に設定したマテリアルが光源です)といった物にも使用されています。
で、このPrecomputed Realtime GIですが、実はOFFにすると「間接光の表現をライトマップに焼き付け」を行います。
例えばRealtimeなDirectional LightにBounce Intensityを設定した状態でライトをベイクすると、下のようにライトマップが焼かれGIが薄っすらと表示されるのが分かります。
これは「動かない・光沢のある・リアルタイムシャドウを使いたい・ダイナミックなGIは不要な」ケースでは有効かもしれないのですが、二重に光の影響を受けるため、色が白とびしやすくなります。
実際問題、Realtime GIをOFFにした場合はリアルタイムライトでBounce Intensityを0にするのが無難かもしれません。
Bounce Intensityは標準値で1なので、Unity 4から移行してきたライトマップは悉くBounce Intensityが1に設定されていると思います。4から5に移行してきた場合は、この項目も注意が必要です。
*1:ライトマップを焼く対象となるstaticオブジェクト