今 Unity のライティング機能はかつてないほど充実しています
ライティングパイプラインには従来のベイクライトマッピング手法の
他にリアルタイムグローバルイルミネーションも加わりました
これらを物理ベースレンダリングと Standard シェーダーと
組み合わせることで
複雑なシーンのライティングをより強力かつ汎用性の高い形で実現できるようになったのです
Unity では物理ベースレンダリング略してPBR を使うことで
各種ライティング状況におけるマテリアルの見た目に
一貫性と説得力を手軽に持たせることができます
これを実現するため Unity ではライトの実際の振る舞いをモデルし
マテリアルに対するライトの干渉が物理法則に
沿ったものになるようにしています
これらマテリアルは通常 Standard シェーダーを用いて作成されます
Standard シェーダーは物理ベースレンダリングを
簡単で扱いやすくします
Unity のパイプラインでもトップクラスの強力を
持つのがリアルタイムグローバルイルミネーション
略して GI です
GI ではシーン内の全ライトが
範囲内のオブジェクトに直接光と
間接光を投射できます
直接光とはシーン内のオブジェクトに
直接光を当てるライトから来るものですが
他方の間接光は
シーン内のサーフェイスに反射・跳ね返ってきた
光を示します
跳ね返った間接光は
近くのオブジェクトを照らし
現実世界の光の振る舞いを模倣します
この間接光は跳ね返る
サーフェイスの色に影響され
投射先にその色の影響を伝えます
直接光と間接光は
混ぜ合わさることでよりリアルな外観を作り出します
Unity の新シーンにはデフォルトのメインカメラの他
デフォルトのスカイボックスが
含まれるようになりました
このスカイボックスにはデフォルトのディレクショナルライトが
付いてきます
各シーンにはまた環境光(Ambient Light)の
デフォルト値が設定されています
環境光はシーン内の全サーフェイスを照らします
この環境光の設定は Lighting パネル >
Environment Lighting タブで指定できます
環境光は
Skybox の他にも
ユーザー指定の 3 色グラデーションや
単色でも作成できます
基本的にシーン内の全オブジェクトは
環境光を受けますが
Ambient Intensity 値を 0 にしたり
環境光のカラー値を黒にしたりすると受けなくなります
現実世界のマテリアルが
反射率を持たないということは
基本的にあり得ません
デフォルトではシーン内の全オブジェクトが
反射情報を受け取ります
なのでこの例ではスフィア・キューブ・プレーンのいずれも
ライトを受けず また環境光も無いにも関わらず
ライティング情報は反射というかたちで
受け取られているわけです
デフォルトの Reflection Source(反射ソース)は Skybox です
これはカスタムキューブマップに変更も可能です
デフォルトの反射を無くすには
カスタムキューブマップを無しにするか
スカイボックスを削除します
なおデフォルトのスカイボックスはプロシージャルに
生成されますが プロシージャルな
スカイボックスはアセットとして
新規作成・保存が可能です
Unity 上でシーンにライティングを加える場合には
Realtime ライティングと
Baked ライティング
およびその両方(Mixed)を使うことができます
Realtime ライティングは実行時に容易に変更が可能ですが
パフォーマンスとの兼ね合いが重要になります
一方の Baked はより詳細なライティング情報を
事前に演算してライトマップテクスチャとして
ディスクに保存しておくことが可能です
このライトマップ情報はその後実行時に
テクスチャから読み込まれるので
プロジェクトの実行時には
ライティングの演算が不要になります
パフォーマンス上は良いことずくめですが
その代償としてシーンの動的な変更には対応できません
Baked ライトマップは実行時に更新されないからです
ライトを Realtime / baked / Mixed の
いずれにするかはライト単位で指定できます
Baked ライティングだけを使うケースとしては
ハードウェア性能の低いモバイルデバイスなど
特定のプラットフォーム向けに作る場合が考えられます
ライトマッピングシステムは継続的にも
オンデマンドにも機能させられます
Continuous Baking をオンにすると
ライティングの変更が編集中にバックグラウンドでベイクされます
これはインスペクターでプロパティを変更したり
シーン内でオブジェクトを
変更したりした場合に反映されます
Continuous Baking をオフにした場合には
変更内容のプレビューはオンデマンドになり
Lighting パネルの Build ボタンを選択した時に反映されます
さてこのシーンには天井から差し込む
ディレクショナルライトがあります
このライトはシーン全体の証明に影響を与えています
まず直接あたったサーフェイスからの
跳ね返りによる影響があり
そしてその跳ね返った光が間接的に近くのサーフェスに与える影響があるためです
この間接的な光は
光の強度(Intensity)が落ちて
跳ね返らなくなるまで繰り返し跳ね返って
近くのサーフェイスを間接的に照らします
ここで光の強度(Intensity)を落とせば
シーン内の照明もそれに応じて暗くなります
同様にディレクショナルライトを
シーン内の別の箇所を
照らすように移動すると
シーン内の照明結果も直接光・間接光共に
それに応じて変化します
Standard シェーダーで作られたマテリアルは実にさまざまな
物理的なサーフェイスを模倣できますが
マテリアルはそれぞれ反射率が異なるため
使用するマテリアルに応じて
シーン内でのライティング結果に影響が生じます
これを調整するため Bounce Intensity(バウンス強度)設定は
ライト単位で調整する他
Lighting パネルからグローバルにも
調整できるようになっています
ここでは照らされたサーフェイスの跳ね返りを
人工的に調整することができるわけです
この他にもシーンの Indirect Intensity(間接光強度)を
調整することなども可能です
また照明においてはライトの他にも
エミッシブ(Emissive / 自己発光)サーフェイスを使うことができます
このシーンにはさまざまなライトとライトタイプが使われていますが
そのうちのひとつがこのエミッシブサーフェイスです
エミッシブサーフェイスは光源のひとつですが
跳ね返った間接光のように振る舞います
このシーン内で最も大きなエミッシブサーフェイスは
メイン通路のジャンクション部分ですが
この他にもパネルが多数配置されています
これらエミッシブサーフェイスは
Standard シェーダーの Emission プロパティで
スケール調節して使用されています
ここで Emission プロパティの横に表示される float 値と
さらに隣になる色を指定すると
シーンの雰囲気は大きく変わります
これらのライトもリアルタイムライトマッピングの一部であるため
コードやアニメーションを利用して
プロジェクトの実行中に
シーンの雰囲気を変えるのに
使うことができます
Unity におけるライティングの構成要素として
ここで最後に紹介するのがプローブです
Unity には 2 種類のプローブがあります
ライトプローブと
リフレクションプローブです
ライトプローブはシーン内のライティングのサンプルを
ワールドのさまざまな位置で取得します
プローブの情報を活用するとパフォーマンス負荷を
抑えたまま シーン内の動的な要素
たとえばキャラクターや移動するオブジェクトの
ライティングに活用できます
もう一方のリフレクションプローブは
反射元の計算に使用する
単一の参照ポイントとして作用します
リフレクションプローブは
反射に含まれるべき内容を
指定する立方骨に囲まれています
そして各プローブは ボックス投影を使用して
周辺の要素からサンプルを取得し
情報をキューブマップに格納します
そして反射サーフェイスマテリアルを含むオブジェクトが
リフレクションプローブのボリューム内にある場合に
このキューブマップを参照して
反射サーフェイスを作成するのです
デフォルトでは各シーンにひとつビルトインの
リフレクションプローブが配置されます
このデフォルトリフレクションプローブは
スカイボックスを反射して基本的な反射を生み出します
より細やかなリフレクションが必要な場合には
リフレクションプローブを追加して
関係するオブジェクトに対して適切に
配置する必要があります
物理ベースレンダリングは
リニアカラースペースでその真価を発揮します
リニアカラースペースでは
よりリアルで数学的にも正しい結果が得られます
最適な結果を得るには
Color Space 設定を Linear に設定します
これはプロジェクトの
Player Settings ウィンドウで指定します
なお Linear は Color Space のデフォルト設定です
なお一部のプラットフォームでは
リニアカラースペースがサポートされておらず
現時点では大半のモバイルプラットフォームで
Gamma が必須カラースペースであることを記憶しておいてください
これまでカバーしてきた要素を振り返ると
Unity でシーンのライティングを
効果的に行なう上での重要な要素は
次のようにまとめられます
環境光(Ambient Light)
リフレクション(Reflection / 反射)
そして光源です
Standard シェーダーで作られたマテリアルを
物理ベースレンダリングで描画し
グローバルイルミネーションで
間接光を計算し
より複雑でもっとリアルな
シーンを作ってみてください