Machio_Kinniku’s diary

自分の身の周りで起きているありとあらゆることを書きます。

UnityのLight関連を完全に理解する(第1章)

前回の章はこちら↓

UnityのLight関連を完全に理解する(第0章) - Machio_Kinniku’s diary

次の章はこちら↓

UnityのLight関連を完全に理解する(第2章) - Machio_Kinniku’s diary

 

お久しぶりです。マチオです。

今回執筆していく記事はUnityのLight関連についてまとめたものです。

本記事は前章の第0章の続き、お待ちかねの第1章です。

※GI(Global Illumination)とEmissionなどが少し出てきますが、詳しい説明は別の章で行います。この段階では、そういう名前のモノがあるんだなぁという認識で大丈夫です。

 

第1章(Light Modeと4つのLight)

第1章の内容は、Light Modeと基礎的な4種類のLightに関してです。

それと軽い事前知識みたいなのも記載したいと思います。

 

~事前知識~

光の種類

光は大きく分けて2つです。

1、直接光(Direct Light)・・・光源から直接照射される光のこと

2、間接光(Indirect Light)(バウンス光)・・・直接光が他の物体(壁とか天井)で反射して照射する光のこと

上記の他にも

・Emission(Emissive Material)・・・光る物体(物質)

・環境光・・・SkyboxからのAmbientLightなど

Direct Light,Indirect Light,Skyboxの3つと考えると分かりやすいかも

ちょっとした用語集

・Lightmap・・・光の計算結果を保存するテクスチャ(画像)

・Bake・・・光の計算結果をLightmapに書き込む行為
※ベイク,焼き込み,Bakedとか色々な言い方がある。意味は大体同じ

・Static(静的)・・・動かないオブジェクト

※StaticにもLightmapStaticとか色々ある。

・非Static(動的,Dynamic)・・・動くオブジェクト

リアルタイムと事前計算

何でもリアルタイムでやれると嬉しいけれど、過負荷で処理が重たいから事前に計算をする。そして、実行時に計算結果を呼び出すと軽いからイイネ!というのが基本。

 

~~~~~以下より本題~~~ ~~

 

Light Mode

Unityで配置するPointLightやDirectionalLightなどの光には、LightModeという設定項目があります。

何を事前計算するのか、何をリアルタイムで計算するのかの設定です。
Realtime,Baked,Mixedの3種類です。

 

1,Realtime

・ 光をリアルタイムに計算して影を出す。Lightmap使用しない。

→直接光はリアルタイムに計算、間接光は無視される。

・静的なオブジェクトはもちろん、動的なオブジェクトにも影を落とせる。

※RealtimeGIが無効だと複雑な計算が不可。有効であれば間接光の表現が可能となる。(静的オブジェクトに対してのみ、Lightmapに焼く。LightProbeがあれば動的なものにも可能)

☆実行中にライト設定を変更する予定(必要)があるライト、または実行中にScriptによって生成されるライトはこのRealtimeを使用する。On/Offを切り替えるライトや点滅するライトなど。

2,Baked

 ・光を事前に計算して影をLightmapに書き込む(ベイク)

→直接光も間接光も事前計算される。

 ・静的なオブジェクトには影が落とせるが、動的なオブジェクトには影が落とせない

・動的なオブジェクトにはLightProbeを使用して適用させる

・間接光の影響により、Realtimeよりも輝度が上がる(想定よりも明るくなった場合はIndirect Multiplerという項目を調節するとよい)

・ノーマルマップをBakedのLightで照らした場合、凹凸は失われないが非常に見えにくくなる。

※BakedGIが有効なときのみ(無効だと強制的にRealtimeになっちゃう)

3,Mixed

 ・RealtimeとBakedを合体させたようなもの

・静的と動的の両方のオブジェクトを照らす

・直接光はリアルタイムに、間接光はLightmapを使用する(ベイクを行う)

※同じくBakedGIが有効なときのみ

↓☆Lighting SettingのMixed Lightingの設定に基づいて計算する↓

3.5,Mixedにした際のLighting Mode

以下の3種がある。1から順に軽い。標準で選択されているのは3のShadowMask。

MobileでもShadowMaskは使われたりするので、特にこだわりがない場合はそのままでよいかも。

1、Subtractive・・・とにかく軽くしたいとき

→負荷は小さいが、品質は低い。

2、BakedIndirect・・・ある程度軽くしたいとき

3、ShadowMask・・・できるだけ綺麗にしたいとき

→負荷は大きいが、品質は高い。とにかく広いステージを作りたい場合はProjectSettingsからDistanceShadowMaskにするとよい。

 

それぞれのModeによって何を計算するかが変わります。詳しくはUnity公式ドキュメントからどうぞ。

 

4つのLight

既知の方がほとんどだと思うので、重要なコトのみ記述します。

 

1,Point Light

一点から全方向へ光を放つ。逆2乗の法則で光は減衰 する。

処理はわりと重いのでBakeだと嬉しい。

 

2,Area Light

RealtimeGIは使用できない。Emissive(Emission)と似ているが、こっちはRealtimeGIが使える。

処理は重いのでBake推奨。

 

3,Spot Light

角度によって多少重さが変化する。

クキー(Cookie or cucoloris) という機能を使用すると、効果的な影を付けることが可能となり、窓から差し込む光などが表現できる。

 

4,Directional Light

光の減衰はなく、方向も一定。明確な光源の位置情報を持たない。

処理はそんなに重くない。

→太陽として使うと良い。Skyboxと紐づけることも可能。

 

上記4つのLightの他にも、SkyboxとEmissionがありますが、また別の章で...

 

まとめ

・配置したLightには、計算方法を決めるLight Modeというものがある。
Mixedにした場合は設定されたLightingModeに基づいて計算する。

 

・LightはBakeで事前計算されていると、実行時に計算結果を呼び出すので処理軽くて嬉しい。 しかし、表現の幅が狭まるので使い分けが必要。

 

終わりに

第0章の続きということで、第1章です。

本当に軽い用語説明と、多くの人が利用するであろう基礎的な部分に関しての記述が多くなった気がします。コレだけは知っておいてね!みたいな感じですね。

続章をお楽しみに。