ライティングとレンダリングの概要 - 2019.3

Tutorial

·

Beginner

·

+10XP

·

60 mins

·

(14)

Unity Technologies

ライティングとレンダリングの概要 - 2019.3

本チュートリアルでは、Unity のリアルタイムグローバルイルミネーションエンジンを使ったライティングの仕組みを学びます。また、利用可能なさまざまなライティングテクニックを紹介し、ライティングのためにプロジェクトを設定する方法を説明して、シーンを照らす方法を検討する際に自由に使えるさまざまなツールが説明されています。

Languages available:

1. ライティングとレンダリングの概要

本チュートリアルは Unity 2019.4.14f1 LTS - を使用して検証しています - https://learn.unity.com/tutorial/introduction-to-lighting-and-rendering-2019-3


現代のゲームライティングでは、グローバルイルミネーションが多用されています。グローバルイルミネーション(GI)とは、ライトが跳ね返ったり、世界と相互作用したりする際のライトの複雑な挙動をシミュレートしようとする、さまざまな技術や数学モデルを説明するために使用される用語です。グローバルイルミネーションを正確にシミュレートすることは困難であり、計算コストがかかります。このため、ゲームでは、ゲームプレイ中ではなく、事前にこれらの計算を処理するために、さまざまなアプローチを使用しています (画像 01)。


画像 01:ライティングなしの同じシーン(左)、直接光のみのシーン(中央)、間接的なグローバルイルミネーションのシーン(右)。光が表面の間で跳ね返ることで色が伝わり、よりリアルな印象を与えていることに注目してください。

画像 01:ライティングなしの同じシーン(左)、直接光のみのシーン(中央)、間接的なグローバルイルミネーションのシーン(右)。光が表面の間で跳ね返ることで色が伝わり、よりリアルな印象を与えていることに注目してください。


本チュートリアルでは、Unity での GI の動作の概要を説明します。さまざまなライティングテクニックを 1つずつ段階的に説明し、ライティングのためのプロジェクトをセットアップする方法を説明し、シーンをライティングする際に自由に使えるさまざまなツールを詳しく見ていきます。


2. ライティングテクニックの選択

大まかに言えば、Unity のライティングは、リアルタイムか事前計算のいずれかで行えます。両方のアプローチを組み合わせて、没入感のあるシーンのライティングを作成することができます。


このセクションでは、さまざまな技術がどのような機会を提供しているのか、その相対的な利点、および個々のパフォーマンス特性について簡単に説明します。



リアルタイムライティング


デフォルトでは、Unity のライト(ディレクショナル、スポット、ポイント)はリアルタイムです。これは、シーンに直接光を与え、フレームごとに更新することを意味します。ライトやゲームオブジェクトがシーン内を移動すると、ライティングは即座に更新されます。これは、Scene ビューと Game ビューの両方で見られます (画像 02)。


画像 02:リアルタイムの光だけでの効果です。跳ね返された光がないため、影は完全に黒くなることに注意してください。スポットライトの円錐内に入る表面のみが影響を受けます。

画像 02:リアルタイムの光だけでの効果です。跳ね返された光がないため、影は完全に黒くなることに注意してください。スポットライトの円錐内に入る表面のみが影響を受けます。


リアルタイムライティングは、オブジェクトをライティングする最も基本的な方法であり、キャラクターやその他の移動可能なジオメトリを照らすのに便利です。


残念ながら、Unity のリアルタイムライトの光線は、単体で使用しても跳ね返りません。よりリアルなシーンを作るためには、Unity の事前計算されたライティングソリューションを有効にする必要があります。



Baked GI ライティング


ライトマップをベイクすると、シーン内の静的オブジェクトに対するライトエフェクトが計算され、その結果がシーンのジオメトリをオーバーレイするテクスチャに書き込まれます (画像 03)。


画像 03:ライトマップを使ったシンプルなシーン(左)と Unity で生成されたライトマップのテクスチャ(右)。影と光の両方の情報がどのように取り込まれているかに注目してください。

画像 03:ライトマップを使ったシンプルなシーン(左)と Unity で生成されたライトマップのテクスチャ(右)。影と光の両方の情報がどのように取り込まれているかに注目してください。


これらのライトマップには、表面に当たる直接光と、シーン内の他の面を跳ね返す間接光を含めることができます。ライティングのテクスチャは、オブジェクトのマテリアルに関連付けられたシェーダによって、カラー(albedo)やレリーフ(法線)のようなサーフェス情報と一緒に使用することができます。


ベイクしたライティングでは、ライトマップはゲームプレイ中に変更することができず「静的」と呼ばれます。リアルタイムなライトは、ライトマップされたシーンで追加的に使用できますが、ライトマップ自体をインタラクティブに変更することはできません。


このアプローチでは、ゲームプレイでライトを動かす機能を、モバイルプラットフォームなどのそれほど強力ではないハードウェアに適した、パフォーマンスの潜在的な向上と交換します。


3. 事前計算プロセス

Unity では、事前に計算されたライティングがバックグラウンドで自動計算されるか、手動で開始されます。いずれの場合も、これらのプロセスがバックグラウンドで実行されている間、エディターで作業を続けることが可能です。


事前計算している間は、青色のプログレスバーがエディターの右下に表示されます (画像 04)。現在の進行状況はプログレスバーの上に表示されています。


画像 04:Unity による事前計算の現在の進行状況を示すプログレスバー。

画像 04:Unity による事前計算の現在の進行状況を示すプログレスバー。


以下はさまざまな処理段階です:


Probes


  1. Ambient Probes (アンビエントプローブ)

  1. Baked/Realtime Reflection Probes(ベイクした/リアルタイムのリフレクションプローブ)

Baked GI


  1. Create Geometry (ジオメトリの作成)

  1. Atlassing (アトラス化)

  1. Baked Resources (ベイクしたリソース)

  1. Baked AO (ベイクした AO)

  1. Export Baked Texture (ベイクしたテクスチャをエクスポート)

  1. Bake Visibility (Visibility のベイク)

  1. Bake Direct (Direct のベイク)

  1. Ambient and Emissive (アンビエントと Emissive)

  1. Create Bake Systems (ベイクシステムの作成)

  1. Bake Runtime (Runtime のベイク)

  1. Upsampling Visibility (Visibility のアップサンプリング)

  1. Bake Indirect (Indirect のベイク)

  1. Final Gather (ファイナルギャザー)

  1. Bake ProbesSet (プローブセットのベイク)

  1. Compositing (コンポジット)

4. 事前計算の開始

Unity の事前計算されたライティングソリューションでは、静的ジオメトリのみが考慮されます。ライティングの事前計算プロセスを開始するには、Static に設定されたゲームオブジェクトが少なくとも 1 つ必要です。これは、個別に行うか、Hierarchy パネルから複数のゲームオブジェクトを Shift キーを押しながら選択することで行うことができます。


Inspector パネルから、Inspector > Static の順に進み Static チェックボックスを選択することができます。これにより、ナビゲーションやバッチ処理を含むすべてのゲームオブジェクトが static オプション、またはフラグが static (静的) に設定されますが、これにより、不要に、ナビゲーションやバッチを静的にしてしまう場合もあります。さらに、細かい制御を行うには、Static チェックボックスの右側にあるドロップダウンリストから、個々の static オプションを設定することができます。また、Lighting ウィンドウの Object エリアでオブジェクトを Static に設定することもできます。


シーンが Auto Lighting > Scene > Auto の順に設定されている場合、Unity のライティングの事前計算は自動的に開始されます。そうでない場合は、以下に説明するように、事前計算の段階を手動で開始する必要があります。


5. 自動/手動の事前計算

Unity の Lighting パネルの下部で Auto Generate を選択すると、静的ジオメトリに変更が加えられるたびに、バックグラウンド処理として事前計算が自動的に開始されます。


ただし、Auto Generate が選択されていない場合は、Generate Lighting ボタンをクリックして事前計算を手動で開始する必要があります (画像 05)。これにより、この処理がいつ開始されるかを制御することができます。


画像 05:ライティング情報の生成は赤色で囲んだボタンをクリックする

画像 05:ライティング情報の生成は赤色で囲んだボタンをクリックする


手動で事前計算を開始すると、シーンのライティングのすべての側面が評価され、(再)計算されます。リフレクションプローブを選択的に再計算するには、Generate Lighting ボタンの矢印をクリックしてドロップダウンを表示します。


6. GI キャッシュ

Baked GI では、Unity はシーンライティングに関するデータを GI Cache に「キャッシュ」 (保存) し、可能な限りこのデータを再利用して事前計算中に時間を節約しようとします。シーンに加えた変更の数と性質によって、このデータをどれだけ再利用できるかどうかが決まります。


このキャッシュは Unity プロジェクトの外に保存され、Preference > GI Cache > Clear Cache の順に移動して削除できます。これを削除すると、事前計算のすべての段階を最初から再計算する必要があるため時間がかかります。ただし、ある場合、おそらくディスク使用量を減らす必要がある場合などでは、これが役に立ちます。


7. レンダリングパスの選択

Unity は、多くのレンダリング技術またはパスをサポートしています。どのパスを使用するかは、プロジェクトを開始する際の初期の重要な決定事項です。Unity のデフォルトはフォワードレンダリングです。


フォワードレンダリング


フォワードレンダリング(Forward Rendering)では、各オブジェクトは、それに影響を与える各ライトのパスでレンダリングされます。そのため、範囲内にあるライトの数に応じて、各オブジェクトが複数回レンダリングされることがあります。


このアプローチの利点は、非常に高速に処理できることであり、ハードウェア要件が他の方法に比べて低いことを意味します。さらに、フォワードレンダリングは幅広いカスタムシェーディングモデルを提供し、透明度を素早く処理することができます。また、マルチサンプルアンチエイリアシング (MSAA) のような(ディファードレンダリング (Deferred Rendering) など)他のレンダリングパスでは利用できないハードウェア技術を使用することもできます。これらの追加オプションは、画質に大きな影響を与えることができます。


しかし、フォワードパスの大きな欠点は、ライトごとにレンダリングコストを支払わなければならないことです。そのため、各オブジェクトに影響を与えるライトの数が多くなればなるほど、レンダリング性能は遅くなります。ライトがたくさんあるゲームでは、これは法外なことかもしれません。ただし、ゲーム内のライト数を管理できるのであれば、フォワードレンダリングは実際には非常に高速なソリューションになります。


ディファードレンダリング


ディファードレンダリング(Deferred Rendering)は、各サーフェスの位置、法線、マテリアルがジオメトリバッファ(G バッファ)にレンダリングされた後、スクリーン上を最初に通過するまで、ライト情報のシェーディングとブレンディングを遅延させます。その後、これらの結果をライティングパスと合成します。このアプローチの利点は、ライティングのレンダリングコストが、ライト自体の数ではなく、ライトが照らすピクセル数に比例することです。その結果、画面上でレンダリングしたいライトの数に縛られなくなります。ゲームによっては、これは重要な利点です。


ディファードレンダリングは安定したパフォーマンスを提供しますが、通常、より強力なハードウェアを必要とします。また、特定のモバイルハードウェアではサポートされていません。


Deferred や Forward、その他利用可能なレンダリングパスの詳細については、Unity ユーザーマニュアルを参照してください。


8. 色空間の選択

レンダリングパスの選択に加えて、プロジェクトをライティングする前に色空間を選択する必要があります。色空間は、ライティングの計算で色を混ぜたり、テクスチャから値を読み込んだりする際に Unity が使用する計算を決定します。多くの場合、どの色空間を使用するかは、ターゲットプラットフォームのハードウェアの制限によって決定されます。


リニア色空間


リアルなレンダリングに適した色空間はリニアです。 これを行うには、Player 設定(メニュー: Edit > Project Settings > Player カテゴリ)で Color SpaceLinear に設定します。


リニア色空間を使用する大きな利点は、シーン内のシェーダーに指定される色が、光の強度が増すにつれて直線的に明るくなることです。別の方法であるガンマ色空間を使用すると、値が上がるにつれて明るさがすぐに白に変わり始め、画質に悪影響を及ぼします (画像 06)。


画像 06:リニア色空間とガンマ色空間を使って点灯します。ガンマ色空間を使って光の強度を上げると、色がすぐに白くなることに注目してください。

画像 06:リニア色空間とガンマ色空間を使って点灯します。ガンマ色空間を使って光の強度を上げると、色がすぐに白くなることに注目してください。


リニアのもう一つの利点は、シェーダーがガンマ(中間トーン)補正なしでテクスチャをサンプリングできることです。これにより、カラー値がレンダリングパイプラインを通過する間、一貫性を保つことができます。その結果、カラー計算の精度が向上し、最終的な画面出力のリアリズムが向上します。


ガンマ色空間


残念ながら、リニア色空間は一部のモバイルハードウェアや特定のゲームコンソールではサポートされていません。このような場合は、代わりにガンマを使用する必要があります。リニアは現在、PC や最新のモバイルハードウェア、現行世代のコンソールについてはサポートされています。


先に進む前に、ターゲットプラットフォームが選択した色空間をサポートしていることを確認することが重要です。色空間の詳細については、Unity ユーザーマニュアルを参照してください。



9. ハイダイナミックレンジ (HDR)

色空間と同様に、カメラのダイナミックレンジも設定する必要があります。基本的に、これは、シーンでカメラがどのように非常に明るい色や暗い色をキャプチャするかを定義します。HDRは、インスペクターの Camera コンポーネントから HDR チェックボックスを選択して有効にすることができます。 一部のモバイルハードウェアでは、HDR はサポートされていないことにご注意ください。また、マルチサンプルアンチエイリアシング(MSAA)などの技術を使用している場合も、フォワードレンダリングではサポートされていません。


HDR は、非常に明るい色を扱う際に精度を保つために、リニア色空間と組み合わせて使用するのが最適です。


デフォルトでは、Unity のカメラは低ダイナミックレンジ(LDR)を使用します。色は各チャンネル(赤、緑、青)で 8 ビットを使用して保存されます。これは、色データが 1 または 0 の 8 つの値で格納されていることを意味しており、各色チャンネルで 256 通りのユニークな組み合わせが可能であることを意味します。1 チャンネルあたり 256 × 256 × 256 色ということは、8 ビットで値を格納することで、黒から白までの 1600 万通り以上の色のバリエーションを一意に参照できることになります。


実際には、実世界の色はこの 1600 万色の範囲をはるかに超えています。色の可能性は無限にあり、明るさも人間の目で見ることができないほどです。同様に、Unity はパソコンの画面のような LDR デバイスで表示できる色を超えた、非常に明るい光にも対応しています。ただし、このような出力デバイスに限界があるにもかかわらず、これらの極端な光の値は、多くのアプリケーションで依然としてなお有用です。


シーンでカメラの HDR を有効にすることで、より精度の高い(浮動小数点表現を使用した)色の保存が可能になります。より明るい輝度範囲で、より多くのユニークな色を扱うことができます。


HDR では、例えば屋外のライトが当たっているシーンと陰になっている部分との明暗差を表現することができます。また、これらの明るい色にブルームエフェクトや輝きのような効果を加えることもできます。このような特殊効果は、パーティクルなどの表示される光源にリアリティを持たせることができます。しかし、極端な色の値は、単に白に固定するのではなく、適切に表現する必要があります。


10. トーンマッピング

写真に例えれば、異なる露出設定を使ってシーンを撮影すると、そうしなければ失われていたであろう極端な色のディテールが見えてきます。白くなってしまった明るい部分の色調や、黒くなってしまった暗い部分の色調を取り戻すことができます。これは、コンピューターグラフィックスのトーンマッピングと同じで、ターゲットデバイス(コンピュータの画面など)で再現可能な範囲外の色を取り、数学的に再現可能な範囲にシフトさせます。このようにして得られた出力は、色の相対性が保たれているため、知覚的には問題ありません。それらはコンテキストの中では正しいのです。


トーンマッピング (Tonemapping) を使用するためには、Window > Package Manager と進み、Package Manager から Post Processing パッケージをインポートする必要があります。トーンマッピングを使用すると、カメラによって記録された極端に明るい色の強度を、表示可能な色に変換する方法を制御できます。


色空間の詳細については、Unity ユーザーマニュアルを参照してください。


11. リフレクション

リフレクションソース (Reflection Source)


デフォルトでは、シーン内のオブジェクトは Unity のスタンダードシェーダー (Standard Shader) を使用してレンダリングされます。 スタンダードシェーダーは物理ベースのシェーダー (physically-based shader、PBS) で、実世界に存在する反射率やエネルギー保存の原理などの物理的特性を模倣することで、マテリアル上の光の挙動を正確に表現しようとするものです。


スタンダードシェーダを使用する場合、すべてのマテリアルは、その鏡面性または「金属性」に基づいた反射率の度合いを表してます (画像 07)。リアルタイムで反射をレイトレースできるような強力なハードウェアがなければ、(事前) レンダリングの反射に頼らざるを得ません。これを行うには、キューブマップを使用します。これは、スカイボックスまたはリフレクションプローブから得られるワールドの 6 面画像で、空間内の特定位置から環境をレンダリングし、その結果をテクスチャに書き出します。これをマテリアルのシェーダーで他のライティングや Surface Data とブレンドして、現実世界で見られる反射率の近似値を求めます。


画像 07: デフォルトでは、強い鏡面反射/金属性の鏡のような反射のマテリアルはスカイボックスを反映します。

画像 07: デフォルトでは、強い鏡面反射/金属性の鏡のような反射のマテリアルはスカイボックスを反映します。


デフォルトでは、Unity シーン内のオブジェクトはスカイボックスを反映します。しかし、この挙動は、リフレクションソースのプロパティを使用して、Lighting ウィンドウでグローバルに変更することができます。スカイボックス、もしくはカスタムキューブマップを使用することができます。リフレクションソースは、リフレクションプローブによってオーバーライドされない限り、シーン内のすべてのオブジェクトによって使用されるシーン全体のキューブマップと見なすことができます。


リフレクションプローブ


多くの場合、オブジェクトが単にスカイボックスを反射することは望ましくありません。多くの場合、オブジェクトがブロックまたは遮断されていたりすることがあります。屋内にあったり、橋やトンネルなどの建築物の下にある場合もあります。より正確な反射を作成するには、リフレクションプローブを使用してオブジェクトが見ているものをサンプリングする必要があります。これらのプローブは、3D 空間内の位置からワールドをレンダリングし、その結果をキューブマップに書き込みます。これで近くにあるオブジェクトがあたかも自分の周りのワールドを反映しているかのように見せることができます。


リフレクションプローブは GameObject > Light > Reflection Probe の順に選択すると追加できます。


リフレクションプローブの位置によって、生成されるキューブマップがどのように見え、何が反射されるかが決まります。一般的に、パフォーマンス上の理由から、プローブの数はできるだけ少ない方が良いとされています。リフレクションプローブは、物理的に正確な結果を得るためのものではなく、ゲームワールドで反射に対する印象を与えるものであることを覚えておいてください。ほとんどの場合、シーン全体に数個のプローブを適切に配置するだけで十分です (画像 08)。


画像 08)左側:デフォルトの反射を使用したシーン。右側:リフレクションプローブを追加した状態。

画像 08)左側:デフォルトの反射を使用したシーン。右側:リフレクションプローブを追加した状態。


リフレクションプローブの Inspector ウィンドウでは、プローブの Type プロパティを BakedCustom、または Realtime に設定できます。Realtime は、各プローブに対してさらに 6 回シーンをレンダリングするため、パフォーマンスに非常に悪影響を及ぼします。Realtime リフレクションプローブが必要とされる特定のケースがあり、これに要する時間は正当化されますが、原則として、Baked リフレクションプローブの方が望ましいです。


ゲームオブジェクトは、Inspector パネルの上部にある Static ドロップダウンで Reflection Probe Static に設定されている場合にのみ、Baked リフレクションプローブに表示されることにご注意ください。逆に、Realtime プローブは、カリングマスクが適用されていない限り、表示されているすべての ゲームオブジェクトをレンダリングします。


12. 環境光ライティング

シーンの全体的な外観と雰囲気への重要な要因となるものは、あらゆる方向からオブジェクトを照らす環境ライティングです。


選択したアートスタイルに応じて、環境光ライティングは、明るくて漫画のようなレンダリングを提供したり、ライティングがテクスチャに手描きされている場合に便利です。また、個々のライトを調整せずにシーン全体の明るさを上げる必要がある場合にも、環境光は便利です。


Unity の事前計算したライティングソリューションを使用しないと、環境光は遮られないため、物理的に正確ではありません。しかし、シーンで Baked GI が有効になっている場合、この光はオブジェクトによってブロックされ、よりリアルな外観を提供します。


画像 09:同じシーンで、光が全くない状態(左)と環境光だけの状態(右)。 Ambient Intensity を変更しても、スカイボックスが変化しないことに注目してください。

画像 09:同じシーンで、光が全くない状態(左)と環境光だけの状態(右)。 Ambient Intensity を変更しても、スカイボックスが変化しないことに注目してください。


画像 10:同じシーンで、オブジェクトを静的なものとして設定し、事前に計算した Realtime GI を使用しています。表面が接触しているところで光が遮られていることに注目してください。

画像 10:同じシーンで、オブジェクトを静的なものとして設定し、事前に計算した Realtime GI を使用しています。表面が接触しているところで光が遮られていることに注目してください。


環境光のレンダリングは負荷が少なく、シーン内のライトの数を最小限に抑えたいモバイルアプリケーションには特に便利です。


スタンダードレンダリングパイプラインでは、環境光ライティングは Environment Lighting セクションで制御でき、Window > Rendering > Lighting Settings > Source の順に選択するとアクセスできます。


デフォルトでは、Source プロパティは Skybox に設定されています。この場合、Skybox はデフォルトの手続き型スカイボックスで、デフォルトの設定では、シーンの環境光ライティングに青味を加えます。Source プロパティの他のオプションとして、単色の Color や、複数の色をシームレスにブレンドする Gradient (グラデーション) などがあります。


環境光の Source の色を変更しても、目に見えるスカイボックスには影響しないことに注目してください。その代わり、シーン内のライティングの色にのみ影響します。


13. ライトの種類

この時点で、プロジェクトをターゲットプラットフォーム用に適切に設定しておく必要があります(一般的に、モバイル向けには Baked GI と Gamma Color Space、スタンドアロン PC や最近のゲーム機向けには Linear Color Space)。


ゲームで必要なライティングを実現するためのツールに移りましょう。


ディレクショナルライト


ディレクショナルライト (Directional Light) は、太陽光のような効果を生み出すのに便利です。限りなく遠くに存在する光源から発する光と考えることができます。


ディレクショナルライトから放出されるレイは互いに平行であり、他の種類のライトのように放射状に広がりません (画像 11)。その結果、ディレクショナルライトが投影した影は、光源からの相対的な位置に関係なく、同じように見えます。これは屋外のシーンをライティングするときに便利です。


画像 11:ディレクショナルライトの仕組み

画像 11:ディレクショナルライトの仕組み


ディレクショナルライトは光源の位置を持たないため、ライトの効果を変えることなく、ライトオブジェクトはシーンのどこにでも配置することができます。しかし、ライトを回転させると、視覚的な結果が変わります。


スポットライトのように光源の位置が明確なライトのタイプでは、キャラクターが光源に近づくにつれてキャラクターの影が変化します。これは、内部レベルでキャラクターの影を生成しようとする場合に問題になることがあります。このような状況では、キャラクターが光源に近いかどうかに関係なく影が一定に保たれるディレクショナルライトが有利です。


ディレクショナルライトは距離を置いても光が減衰することもありません。シーン内の全てのサーフェスに影響を与えるので(カリングされていない限り)、ディファードレンダリングを使用する際には負荷がかかります。しかし、負荷がかかっているにもかかわらず、少なくともパフォーマンスは安定しているでしょう。


デフォルトでは、すべての新しい Unity のシーンにディレクショナルライトが含まれています。Unity 2019.3 では、これは Lighting Panel の Environment Lighting セクションで決定される手続き型スカイシステムに関連付けられています。この挙動を変更するには、デフォルトのディレクショナルライトを削除して新しいライトを作成するか、Sun Source パラメーター(Window > Rendering > Lighting Settings > Sun Source)から異なるゲームオブジェクトを指定するだけです。


デフォルトのディレクショナルライトを回転させると、Skybox が更新されます。ライトは横の角度、つまり地面に平行になると、日没のような効果になります。さらに、ライトを上に向けると、空が暗くなり、夜のようになります。上方からライトをあてると、空は日中の様子になります。


環境光源 (ambient source) として Skybox を選択すると、環境光ライティングもその色に対応して変化します。


ポイントライト


ポイントライト(Point Light)は、3D 空間内 のある一点に位置していると考えることができ、そこから全方向に同等に光を放ちます。これらは、電球や武器の輝き、爆発など、オブジェクトから光を放つことを想定したエフェクトを作成するのに便利です。


ポイントライトの強度は、光の中心部での最大強度から、光の届く限界でゼロになるまで距離とともに減衰します。これは Range プロパティで定義されます (画像 12)。光の強度は、光源からの距離の 2乗に反比例します。これは「逆 2乗の法則」として知られ、実世界での光の性質に似ています。


画像 12: ポイントライトは全方向に同等に光を放ちます。球体のギズモが光の範囲を表しています。この限界に達すると光はゼロになりますが、跳ね返った光や間接的な光はもっと遠くまで続くことがあります。

画像 12: ポイントライトは全方向に同等に光を放ちます。球体のギズモが光の範囲を表しています。この限界に達すると光はゼロになりますが、跳ね返った光や間接的な光はもっと遠くまで続くことがあります。


ポイントライトのシャドウを有効にするには、負荷がかかる場合がありますので、控えめに使用する必要があります。現在、ポイントライトは間接的な反射光のシャドウをサポートしていません。これは、ポイントライトによって生成された光がオブジェクトを通過し続け、範囲によって減衰されない限り反対側に跳ね返ることを意味します。そのため、壁や床から光が漏れることがありますので、そのような問題を避けるためにライトの配置には注意が必要です。ただし、Baked GI であれば、このような問題はありません。


スポットライト


スポットライト (Spotlights) は、前方(+Z)方向に光を一点から円錐形に放出します (画像 13)。この円錐の幅は、ライトの Spot Angle パラメーターによって定義されます。ライトは光源の位置から光の当たる範囲に向かって減衰していき、最終的には消えていきます。また、ライトはスポットライトの円錐の端で減衰します。角度を広げると円錐の幅が広くなり、それにより、「penumbra」と呼ばれるフェードのサイズが増加します (画像 14)。


画像 13:スポットライトの表示

画像 13:スポットライトの表示


スポットライトには、シーン内のライティングとしてさまざまな用途があります。街路灯や壁のダウンライト、また懐中電灯のようなライティング効果にも使用できます。スポットライトを使うことで、影響を受ける範囲を細かくコントロールできるため、キャラクターに焦点を当てたり、ドラマチックなステージを演出するようなライティング効果を作成するのに非常に有効です。


画像 14:光源からの距離が長くなると光が減衰していきます。

画像 14:光源からの距離が長くなると光が減衰していきます。


スポットライトによって生成された光は、ジオメトリを通過して反対側に跳ね返ってきます。そのため、配置は慎重に考える必要があります。


エリアライト


エリアライト(Area Light)は、写真家のソフトボックスに似ていると考えることができます (画像 15)。Unity では、光は表面エリア全方向に均一に放射される長方形として定義されていますが、長方形の片側のみからになります。エリアライトの範囲に関しては、手動の制御はできません。ただし、光源から遠くなるにつれ、光の強度は距離の逆 2乗で減少します。


画像 15:エリアライトの表面からライトが放射され、柔らかなシャドウをつくる拡散ライトを作成します。

画像 15:エリアライトの表面からライトが放射され、柔らかなシャドウをつくる拡散ライトを作成します。


エリアライトは、柔らかいライティング効果を演出したい場合に有用です。一般的な用途としては、天井のストリップライトやバックライト付きパネルなどがあります。


シーンへのエリアライトの寄与を計算するためには、ライトが見えるかどうかを判断するために、各ライトマップのテクセルからライトに向かって多数の光線を放射しなければなりません。つまり、エリアライトは計算が高負荷になり、ベイク時間を増加させる可能性があるとおいうことです。しかし、うまく使えば、エリアライトはシーンにリアル感を与え、余分な計算をかけるのに十分な理由となります。なお、これらはベイクしただけなので、ゲームプレイのパフォーマンスには影響しません。


14. エミッシブマテリアル

エリアライトは Precomputed Realtime GI にサポートされていませんが、エミッシブマテリアルを使えば類似のソフトライト効果が可能になります。エリアライトのように、 エミッシブマテリアル は、その表面に発光します。 エミッシブマテリアルは、シーン内の反射光を作るのに効果的で、色や強度などの関連するプロパティをゲームの間に変化させることができます。


Emission はスタンダードシェーダー (Standard Shader) のプロパティで、シーン内の静的オブジェクトを発光させることができます。デフォルトでは Emission の値はゼロに設定されています。つまり、スタンダードシェーダーを使ってマテリアルを指定したオブジェクトは、まったく発光しないということです。


エミッシブマテリアルに範囲の値はありませんが、放射されるライトは、ここでも 2 次的割合で減衰します。放射された光を受けることができるのは、インスペクターで Static Lightmap Static に設定されたオブジェクトだけです。同様に、キャラクターのような、静的でない、つまり、動的なジオメトリに適用されたエミッシブマテリアルはシーンライトには影響を与えません。


ただし、0 以上の Emission を持つマテリアルは、たとえ、シーンライトに影響を与えなくとも、スクリーン上で明るく発光しているように見えます。この効果は、Inspector で Standard Shader の Global IlluminationNone にすることによっても作り出すことができます。このように自己発光するマテリアルは、ネオンなどの目に見える光源を表現するのに役立ちます (画像 16)。


画像 16:Unity の Standard Shader の Emission プロパティを使って作成したシンプルなネオンサインです。看板からの発光が、静的ジオメトリ(この場合は球体)によって影になっていることに注目してください。

画像 16:Unity の Standard Shader の Emission プロパティを使って作成したシンプルなネオンサインです。看板からの発光が、静的ジオメトリ(この場合は球体)によって影になっていることに注目してください。


エミッシブマテリアルは、シーン上で静的ジオメトリに直接効果を与える場合にのみ有効です。キャラクターのような動的、つまり、静的でないジオメトリにエミッシブマテリアルからライトを当てる必要がある場合は、ライトプローブを使用する必要があります。ゲームプレイ時に発光の値を変更すると、ライトプローブがインタラクティブに更新され、その結果はライトプローブからのライトを受けているオブジェクトで見ることができます。


15. ライトプローブ

Unity の Baked または Precomputed Realtime GI システムでは、静的オブジェクトのみが考慮されます。インタラクティブなシーンの要素やキャラクターなどの動的オブジェクトが、静的ジオメトリに当たるたくさんの光のバウンスなど動的な反射光を受けるには、このライティング情報を、ゲームプレイ中に素早く読み取ってライティング方程式で使用できるフォーマットに記録する必要があります。


これは、ゲーム世界にライティングのサンプリングポイント(球)を配置し、 全方向からのライトに関する情報を取得することで実現しています。これらのポイントが記録した色の情報は、ゲームプレイ中に素早く評価できる値(または係数)にエンコードされます。Unity では、これらのサンプリングポイントをライトプローブと呼んでいます (画像 17)。


画像 17:ライトプローブを使用したシーン。影や色の変化など、ライティングが変化する領域に高密度に配置されているのがわかります。

画像 17:ライトプローブを使用したシーン。影や色の変化など、ライティングが変化する領域に高密度に配置されているのがわかります。


ライトプローブを使用すると、ライトマップに影響を与えている複雑にバウンスした光と同じように、オブジェクトを移動させて反応を起こすことができます。オブジェクトのメッシュレンダラーは、その位置周辺のライトプローブを探し、プローブ間のブレンドを適用します。これは、ライトプローブの集合で構成した四面体を探し、オブジェクトの中心 (pivot) がどの四面体に該当するかを判断することで行われます。これにより、動くキャラクターをシーンの中に配置しても、きちんと融合して見えるようになりました。ライトプローブがないと、動的オブジェクトはグローバルイルミネーションを受けることができないので周囲のライトマップされたジオメトリよりも暗く見えます。


デフォルトではシーン内にライトプローブは存在しないので、ライトプローブグループ(GameObjects > Light > Light Probe Group の順に選択)を使用して配置する必要があります。


シーンを事前計算に設定するには Lighting ウインドウ (Window > Rendering > Lighting Settings > Auto Generate) の一番下にある「Auto」ボックスを有効にすると、シーンのライティング、または静的ジオメトリに変更が加えられるたびにライトプローブが自動的に更新されます。有効にしない場合は、Build ボタンがクリックされたときに更新されます。


16. まとめ

このチュートリアルでは、ライティング用のシーンを設定する前に必要な考慮事項と、様々なライティングエフェクトを作成するために利用可能なツールについて簡単に説明しました。


Complete this tutorial