-
今 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 シェーダーで作られたマテリアルを
-
物理ベースレンダリングで描画し
-
グローバルイルミネーションで
-
間接光を計算し
-
より複雑でもっとリアルな
-
シーンを作ってみてください