Unityのライティングシステムの隅にひっそりと存在するArea Light(エリアライト)、その知られざる生態系について、今回は踏み込んでみようと思います。
影の表現が柔らかくなるAreaLight
AreaLightですが、マニュアルを見ても「ライトが柔らかくなる」的な事しか書いていません。
エリアライトは複数の異なる方向から同時にオブジェクトを照らすので、他の種類のライトと比べてシェーディングが柔らかく繊細になります。
細かい事は置いておいて、実際にAreaLightとDirectional Lightを比較すると、確かに影がかなり柔らかくなっています。左がAreaLight、右がDirectional Lightです。
Directional Lightはハッキリ輪郭が見えるのに対し、AreaLightは濃淡はハッキリしていますが輪郭はボヤけて見えます。
広い範囲からの照射ばぼんやり、狭い範囲からの照射はハッキリ
Area Lightの挙動は2パターンのライト画像を比較すると、何となく想像が出来ます。
下にAreaLightの横幅が狭い物と広い物を用意して比較しました。狭いAreaLightは影の濃淡がハッキリと見えていますが、広いAreaLightは全体的に薄く広く広がっています。
実際の実装は分かりませんが、挙動としては多分こんな感じです。
AreaLightは複数の異なる方向から対象のオブジェクトを照らして、ふんわりと柔らかい影を表現してるんじゃないかなと思います。
ちなみに現実も、空も光は太陽から直で来る訳ではなく大気である程度拡散してから降り注ぐ感じになると思います。それは正しいか?もっと詳しく?そんなこと俺が知るか!
AreaLightの影は静的なオブジェクトに焼く
ふわっと優しくなるAeraLightは、残念ながらリアルタイムに影を表現する事が出来ません。基本的に静的なオブジェクトに焼き、ライトマップを使用する感じで利用します。
基本的な光表現はLightProbeでダイナミックなオブジェクトに受け渡します。また、ScreenSpaceAmbientOcclusion等でAO表現や古き良き丸影を使うと、意外と馴染んで見えたりします。
発光するEmissiveオブジェクト
AreaLightと似たような性質を持つ機能として、Emissiveな属性を持つマテリアル(材質)を持つオブジェクトという物があります。
例えばStandardAssetsの場合、Emissiveが設定されていて、かつLightmapのstaticが入ったオブジェクトであれば、発光します。
Emissiveの特性
EmissiveなオブジェクトはAreaLightと異なり、GIモードがRealtimeモードならばランタイム時に光の強度や色を変更する事が出来ます。
ただ、基本的にEnlitenのRealtime GI Resolutionベースで光源を設定しているので、Realtimeモードの場合はAreaLightと比較して光の表現が雑です。
AreaLightと似たような特性
雑ではありますが、AreaLightと同様に広い範囲から照射すればフワッとした、狭い範囲から照射すれば割とハッキリとした影が表現されます。
また静的(static)なオブジェクトにしか影や光源が反映しないのも同様です。基本的に動的に動かすオブジェクトに影響を与えたい場合、Lightprobe様が大活躍します。
また、マテリアルのGIモードをBakedに設定し、Final Gatherを設定すると、AreaLightと比較して殆ど見分けがつかないレベルの光が表現出来ます。
発光する範囲と形状
Emissiveなオブジェクトの優位性の一つは、テクスチャでマスクを設定したり、複雑な範囲は形状から発光出来る点です。
Emissiveな項目にテクスチャを設定すると、光が漏れないようにマスクを掛けたり、光の色にフィルターをかけるような表現が出来ます。
また、マテリアル単位で光るので、複雑な…例えば蛍光灯やネオンのような表現も出来たりします。Arealightは基本的に四角で表現するので、複雑な形状を表現したい場合には若干有利です。
で、どっちが良いの?
個人的にはEmissiveなオブジェクトの方が使いやすいといえば使いやすいです。
ただしRealtimeGIベースは表現が割と汚くなりやすく、しかしてBaked&FinalGatherを使用するとライトを焼くのに猛烈に時間がかかるので、その辺りがネックになります。
個人的な使い分けとしては、広範囲にやるならAreaLight、蛍光灯等の細かいパーツならEmissiveオブジェクト、輝度があまり高くなくうっすらと光る程度ならEmissiveといった感じです。
ちなみにUnity 5.6b6にProgressive Lightmapperという、「任意の範囲を優先して焼く&EmissiveをRealtimeGIベースじゃなくす」機能を持ったライティングモードが追加されるので、ある意味Emissiveの問題は回避は出来るといえば出来るようになるかもしれません。
シーンビューで見てる位置を優先して、粗いライティングから収束していく感じでライトを焼いてくれます。広いマップでも見てる範囲を優先して焼いてくれるので、確認したい範囲をサクサクっと確認出来て便利