リアリスティックなレンダリングをUnity内で行いたいと思い、ライティングについて調べ始めました。DirectionalLightが1つだと、現状下の絵のように見えます。反射光や同一面でのグラデーションは全くないように見受けられます。影もかなり強く出ています。もっとしっとりとした絵にならないかと思い、ライティングをいじってみました。
まず、初めに、色々なライトをモデル内に配置し、挙動を確認しようと思ったのですが、AreaLight が反映されずに困りました。良く調べてみると何やら計算に時間がかかっていて、正しくレンダリングされていないということが分かりました。下記の様なバーが画面右下にでて、進んでいないという事が確認できます。
ライティングの基礎を押さえる上で、大きいサイズのモデルを使うと計算に時間がかかってしまうという事が分かったので、一度軽いモデルでライティングをテストしてみました。
DirectionalLight,PointLight,AreaLight,SpotLight,ReflectionProbeを画面上に配置し、挙動を確認しました。この時、AreaLightだけは、ただ配置しただけでは表示されません。ライトを正しく反映させるにはライトとライトが投影される物体のStaticにチェックを入れる必要があります。
それから、ReflectionProbeは置いた場合と置かない場合で違いが良く分かりませんでした。今後の課題とします。
このstaticというのがかなりレンダリングに関係した重要なチェック項目であるように感じました。調べてみるとかなり細かいレンダリングの設定がこれにチェックを入れるかどうかで変わってくるようです。まだ、内容を一つづつ把握していません。
【Unity】GameObjectのstatic設定についてのアレコレ
細かい事は抜きにして、大雑把にいうと、ライティングの仕方にはRealtimeとBakeという二通りのやり方があり、Bakeを使用してライティングの事前計算を行うためには、staticにチェックを入れる必要があると、理解しています。
RealtimeLightingでは反射光等が計算されないため、しっとりとしたレンダリングにはならない、その代わり計算が早いという特徴があります。一方、Bakeを使用する場合、Window>Rendering>LightingSettingのAutoGenerateにチェックが入っている場合、オブジェクトを動かしたり調整したりするたびに、自動的に計算が始まり、その計算が終わるまで、正しいライティングの表示はされないようです。
これを踏まえて、大きなモデルでライティングを試してみました。まずは、ガラス面に移り込みを入れたかったので、PointLightを配置しました。これは事前計算不要のRealtimeにしています。
次に周囲のビルとガラス面の反射光の影響を使用するためにレンダリングしたい要素のStaticにチェックを入れました。すると、計算が始まり、途中で止まってしまいました。もしかしたら、ずっと待てば解消されたのかもしれませんが、”ライトマップのベイク時間を短時間で終わらせる”のリンク先で説明されているようにセッティングをいじれば短時間で計算が可能だという事なので、いじってみました。
具体的にはIndirectResolutionの値を2から0.5に変更することで、クラスタリングにかかる時間が遥かに早くなるという事が分かりました。クラスタリングというのはオブジェクトのライトを計算する際に面をいくつに分割するかというような話らしく、シーンビューのプルダウンメニューより、clusteringというのを選択することでどの程度の粗さなのかを確認できます。
例えばIndirectResolutionの値を0.5にした場合、上のような分割具合になります。
例えばIndirectResolutionの値を0.2にした場合、上のような分割具合になり、0.5と比べると粗いのが分かります。大きなモデルの場合、この値を大きくするとクラスタリング自体の時間がすごく長くなってしまうので、必要最小限にしておくことで時間短縮できます。
また、シーンビューのプルダウンメニューでLitClustringというのを選択することでどの程度の粗さで明るさの分布が計算されているかの確認ができるようです。0.5だと下のような分布になっています。
私はここで、モデルが白飛びしてしまいました。色々いじった結果、下記の事が分かりました。
マテリアルのMetalicとSmoothnessという値によっては、モデルが白飛びしてしまうので、モデルが真っ白になってしまったら、それらの項目を調整することで、解決する場合があります。
又、lightingSettingのFogにチェックが入っている場合も白飛びすることがあるので、Fogの項目も要チェックです。
それから、全体にふんわりとした光を入れたかったので、左側にEmissionで白い光を出す平面オブジェクトを配置してみました。これによってモデル全体の影がふんわりと弱くなり、雰囲気が出てくる気がします。これもStaticにチェックを入れてbakeしてあります。
RefrectionProbeも配置してみたのですが、まだ勉強不足で、映り込みが上手く反映されていないように感じます。今後の課題です。
今の所、下のような状態になっています。少しずつふんわりとした雰囲気のライティングができるようになってきています。今後も勉強していきたいと思います。
Rhinocerosモデルのunityへの取り込みについて詳しく知りたい方は下の記事もご参考下さい。