ライティング - 技術的な情報と用語
混合ライティング

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

リアルタイム ライトは、Mode プロパティーを Realtime に設定した Light コンポーネント です。

プロパティーを変更する必要があるライト、またはゲーム中にスクリプトを通して生成されるライトには、Realtime モードを使用します。Unity は、ランタイムに毎フレームでこれらのライトを計算し更新します。ライトは、プレイヤーによって行われるアクション、またはシーンで発生するイベントに応じて変化します。例えば、オンとオフを切り替えたり (例えば、点滅するライト)、Transform を変更したり (例えば、暗い部屋を運ばれていくたいまつ)、Color や Intensity などの視覚的なプロパティーを変更できます。

リアルタイムライトは、静的オブジェクトと動的オブジェクト両方を照らし、現実的な影を投げます。リアルタイムライトは、 Shadow Distance ( Edit > Project Settings > Quality で定義) 以内の距離で影を生成します。

また、リアルタイムライトを Realtime Global Illumination (リアルタイム GI) と組み合わせることができます。そのため、リアルタイムライトは、静的ゲームオブジェクトと動的ゲームオブジェクトへの間接ライティングも生成します。

リアルタイム GI を使ってリアルタイムライティングを使用する

リアルタイムライティングと リアルタイム GI の組み合わせは、Unity で最も柔軟で現実的なライティングオプションです。リアルタイム GI を有効にするには、Lighting ウィンドウ ( Window > Lighting > Settings) を開き、 Realtime Global Illumination にチェックします。

リアルタイム GI を有効にすると、リアルタイムライトによって、シーンに直接ライティング同様、間接ライティングを加えることができます。この組み合わせは、ゆっくりと変化し、シーンに強い視覚的影響を与えるライトに使用します。例えば、空を横切る太陽や、遮蔽された廊下でゆっくりと点滅する光などです。素早く変化するライトや特殊効果に リアルタイム GI を使用する必用はありません。システムの待ち時間があるため、リアルタイム GI を使用しても、結果がそのオーバーヘッドに見合わないからです。

リアルタイム GI は、それほど複雑ではない ベイクした GI と比較して、著しくシステムリソースを消費します。Unity のグローバルイルミネーションは、それ自体のオーバーヘッド (システムメモリと CPU サイクル) を持つEnlighten というミドルウェアによって管理されています。詳細については、グローバルイルミネーション に関するドキュメントを参照してください。

リアルタイム GI は、中間レベルからハイエンドの PC システムをターゲットとしたゲームや、PS4 や Xbox One などの現世代のコンソールをターゲットとしたゲームに適しています。一部のハイエンドモバイルデバイスでも十分この機能に適応するものもありますが、シーンを小さくし、リアルタイムライトマップの解像度を低くして、システムリソースを節約する必要があります。

特定のライトで リアルタイム GI の効果を無効にするには Light ゲームオブジェクトを選択し、Light コンポーネントで Indirect Multiplier を 0 に設定します。つまり、ライトが間接ライトにまったく影響を与えないようにします。リアルタイム GI__ をすべて無効にするには、Lighting ウィンドウ( Window__ > Lighting > Settings) を開き、Realtime Global Illumination のチェックを外します。

リアルタイム GI を使ってリアルタイムライティングを使用することの不利益

  • メモリ要件の増加。Enlighten ライティングシステムで計算されたリアルタイムの間接バウンスを格納するために、追加の低解像度のリアルタイムライトマップを使用するため。

  • シェーダー計算要件の増加。Enlighten ライティングシステムで計算されたリアルタイムの間接バウンスを格納するために、追加のリアルタイムのライトマップとプローブのサンプリングを行うため。

  • 間接ライティングは時間の経過に伴って収束するので、あまり急激なプロパティーの変化を処理できません。 adaptive な HDR トーンマッピングは、これを隠すのに役立つ場合があります。 詳細については、Unity の Post Processing Stack (Asset Store) を参照してください。

技術的な詳細

リアルタイムライトの場合 (Light コンポーネントで、 ModeRealtime に設定)、ライトからサーフェスへの最後のエミッション (または、パスセグメント) は事前計算されません。つまり、ライトはシーン内を移動でき、Color や Intensity などの視覚関連のプロパティーは変更可能です。パスセグメントに関して詳しくは Unity での Enlighten の使用 を参照してください。

ライトが影も生成する場合、シーン内の動的および静的ゲームオブジェクトの両方がライトの シャドウマップ にレンダリングされます。このシャドウマップは、静的および動的の両方のゲームオブジェクトの マテリアルシェーダー によってサンプリングされ、互いにリアルタイムの影を投げ合います。 Shadow Distance ( Edit > Project Settings > Quality > Shadows) は、影がフェードアウトし始めて完全に消える最大距離を制御し、パフォーマンスと画質に影響を与えます。

リアルタイム GI が有効でない場合、リアルタイムライトは動的および静的ゲームオブジェクトの直接ライティングしか計算しません。リアルタイム GI が有効な場合、Unity は Enlighten を使用して静的ゲームオブジェクトのサーフェスからサーフェスへのライトパスを事前計算します。

事前計算した リアルタイム GI モード: Unity は サーフェスからサーフェスへのライトパス情報を事前計算します

最後のパスセグメント (つまり、サーフェスから光源までのセグメント) は、事前計算に含まれません。唯一保存される情報は、サーフェスが照らされているかどうか、照らされている場合は、それに続くサーフェスやプローブも照らされているかどうか、それに、それらの様々な照明の強さのみが保存されます。別に低解像度のリアルタイムライトマップがあり、Enlighten はランタイム時に CPU で、リアルタイムライトの情報を使いそれを繰り返し更新します。この反復処理は計算的に負荷が高いため、いくつかのフレームに分割されています。つまり、ライトがシーンの静的要素を横切って完全に反射し、リアルタイムライトマップと ライトプローブ が最終結果を得るまでには、数フレームが必要です。

ゆっくりと変化するプロパティーを持つライト (例えば、光を放ちながら空を横切る太陽など) の場合、問題ありません。しかし、プロパティーが素早く変化するライト (ちらちらする電球など) では、リアルタイム GI の反復性は不適切な場合があります。高速で動くプロパティーの変化は、反射のライトシステムにほどんど確認されないため、計算に加えても意味がありません。

この問題に対処するにはいくつかの方法があります。1 つめの方法は、リアルタイムのライトマップ解像度を低くすことです。これにより、ランタイム時の計算が少なくなるため、ライティンングはより早く解決します。もう 1 つのオプションは、リアルタイム GI ランタイムに可能な CPU 使用率 を増加させることです。より多くの時間を CPU で使用することにより、ランタイムにかかる時間は短縮されます。もちろん、これと引き換えに、他の部分で使用できる CPU 時間が少なくなります。ですから、これが適切な方法かどうかは個々のプロジェクトによって異なります。これはシーンごとの設定であるため、プロジェクトの各シーンの複雑さに基づいて、より多い、または、より少ない CPU 時間を割り当てることができます。

リアルタイム GI は、すべてのリアルタイムライトをシーンごとに有効/無効にしますが、個々のリアルタイムライトを リアルタイム GI に属さないようにすることも可能です。 これを行うには、Light コンポーネントの ModeRealtime にし、 Indirect Multiplier を 0 に設定し、間接ライトの影響をすべて除去します。


  • 2017–06–08 限られた 編集レビュー でパブリッシュされたページ

  • Light Modes、 5.6に追加

ライティング - 技術的な情報と用語
混合ライティング