このガイドは Unity ブログ Spotlight チームのベストプラクティス - ライティングパイプラインのセットアップ - Pierre Yves Donzallaz を更新したものです。
最初に、このガイドで頻繁に登場するいくつかの重要なグラフィックスレンダリング用語の定義を見てみましょう。
これらの操作は、フレームレートに応じて、1 秒間に何度も繰り返されます。
次のフローチャートは、コンテンツ作成者の視点で、Unity のすべてのライティングパイプライン全体を高レベルから見たものです。
まず、レンダリングパイプラインを選択します。次に、間接光をどのように生成するかを決定し、それに応じてグローバルイルミネーション (GI) システムを選択します。すべてのグローバルライティング設定がプロジェクトに適切に調整されていることを確認した後、ライト、エミッシブサーフェス、リフレクションプローブ、ライトプローブ、Light Probe Proxy Volume (LPPV) を加えます。これらすべてのライティングオブジェクトの使用法や機能の詳細はこのページのスコープを超えています。ですから、マニュアルのライティングのセクションを読んで、プロジェクトで正しく活用する方法を学ぶことをお勧めします。
2018 年の初めまで、Unity で使用できるレンダリングパイプラインは ビルトインレンダーパイプライン 1 つだけでした。このレンダリングパイプラインでは、フォワードとディファードの レンダリングパス が選択できます。
2018 年 1 月に、スクリプタブルレンダーパイプライン (SRP) を発表しました。これを利用すると、C# スクリプティングを使用してレンダリングループをカスタマイズすることができます。実際、これはゲームエンジンの分野での小さな革命です。ユーザーはついに、C++ のような低レベルのプログラミング言語を使用せずに、オブジェクトのカリング、描画、フレームのポストプロセスをパーソナライズすることができるようになりました。
Unity は現在 2 つの構築済み SRP を提供しています。
タイルはフレームの小さな 2 次元の正方形のピクセル範囲であり、クラスターはカメラの錐台内部の 3 次元ボリュームです。タイルとクラスターのレンダリング技術は両方とも、個々のタイルとクラスターに影響を与えるすべてのライトのリストに依存しています。タイルやクラスターのライティングは、それから、既知のライトの対応リストを使って 1 回のパスで計算されます。不透明なオブジェクトはタイルシステムを使用してシェーディングされることが最も一般的ですが、透明なオブジェクトはクラスターシステムを利用します。このレンダラーが提供する主な利点は、ビルトインレンダリングパイプライン (ディファード) と比較して、ライティングの処理が高速で、帯域幅消費が大幅に削減されることです。ビルトインレンダーパイプラインは、ずっと時間のかかるマルチパスのライト集積を利用しています。
下のフローチャートを使用すると、いくつかの重要な基準に基づいてどのレンダリングパイプラインを選択すべきかがすぐにわかります。
HDRP と LWRP の最新バージョンは Unity Package Manager (Window > Package Manager) からダウンロードできます。これらの SRP の 1 つを開始するもっとも簡単な方法は、Unity Hub で対応するテンプレートの 1 つを使用して新しいプロジェクトを作成することです。
HDRP 用にプロジェクトを設定したい場合は、必要なパッケージがインストールされていることを確認してください。次に、HD レンダーパイプラインウィザード (Window > Render Pipeline > HD Render Pipeline Wizard) を使用して、プロジェクトをワンクリックで設定します。
レンダリングに関する知識があり C# に精通していて、プロジェクトのレンダラーの完全な調整が必要な場合は、SRP の概念を使用して、カスタムのスクリプタブルレンダーパイプラインを作成できます。ユニバーサルレンダーパイプラインはシェーダーライブラリが小さく、レンダリングパスを簡単に挿入、除去、スワップすることができるため、拡張が特に容易です。
プロジェクトのマテリアルをビルトインレンダーパイプラインから HDRP か URP に変換するのは、Edit > Render Pipeline > Upgrade… の 1 クリックマテリアルコンバーターのおかげで比較的簡単です。ただし、それは不可逆的な操作であることに注意してください。事前にプロジェクトをバックアップすることを強くお勧めします。
それでも、カスタムシェーダーは手作業で変更する必要があるため、ビルトインレンダーパイプラインから HDRP または URP への移行は、書き直す必要があるカスタムシェーダーの数に応じて、時間がかかる場合があります。
さらに、HDRP はビルトインレンダーパイプラインよりも物理的に正確であるため (特に光の減衰と分布に関しては)、HDRP に切り替えた後にプロジェクトが同じように見えると期待すべきではありません。
さらに、HDRP と URP は同じレンダリング機能を共有しないため、相互互換性がありません。プロジェクトを HDRP から URP に、またはその逆に変換することは可能ですが、1 クリック操作ではなく、ライティング、マテリアル、シェーダーを手動で再処理する必要があります。
シーンに間接光を加えたい場合は、Unity の 2 つのグローバルイルミネーションシステムの 1 つを使用するか、独自のベイクのソリューションを使用してそれを生成する必要があります。Unity で使用可能な 2 つのシステム (Window > Rendering > Lighting) は以下の通りです。
つまり、Unity 2019.3 以降で新しいプロジェクトを開始する場合、URP または HDRP を使用すると Enlighten は使用できません。ビルトインレンダーパイプラインを選択すると、Enlighten は2020 年末/2021 年初頭まで使用できます。
プログレッシブライトマッパーは、シーン全体のすべてのベイク時間を増加させる代わりに、カメラから見えるオブジェクトのライティング計算を優先し、ライティングのイテレーションを大幅に高速化します。プログレッシブライトマッパーは CPU を使用してパストレースで間接光を計算します。新しい GPU プログレッシブライトマッパー は現在開発中で、シーンのベイク時間を著しく短縮します。
Enlighten とプログレッシブライトマッパーはどちらもベイクしたライトを作成するために異なる方法を使用しているため、結果のライトを比較すると正確に同じとは限りません。
下の図を見て、どのような GI システムがプロジェクトに適しているか、またその主な長所と短所を判断してください。
どのような GI システムを使用する場合でも、ライティングのベイク/事前計算の際に、 “Contribute GI” とマーク付けされたオブジェクトのみが考慮されます。動的な (つまり静的でない) オブジェクトは、間接光を受けるためにシーン全体に配置したライトプローブに依存します。
ライトのベイク/事前計算は比較的遅いプロセスなので、凹面やセルフシャドウなど、明確なライティングの変化を伴う大規模で複雑なアセットのみを “Contribute GI” としてマーク付けすべきです。均一なライティングを受ける小さい凸状のメッシュは “Contribute GI” として扱うべきではありません。したがって、よりシンプルなライトの近似を格納する ライトプローブ から間接光を受ける必要があります。大きい動的オブジェクトは、より局部化された間接光を受けるために LPPV を使用することができます。シーン内で “Contribute GI” とマーク付けするオブジェクト数を制限することは、適切なライト品質を維持しながらベイク時間を最短にするためにとても重要です。最適化のプロセスとプローブライティングの重要性については チュートリアル を参照してください。
Unity ではベイクされた GI システムとリアルタイム GI システムの両方を同時にアクティブにすることができ、これによりすべてのライティング機能にアクセス可能です。ただし、両方のシステムを有効にすると、同じデータセットに依存しないため、ランタイム時のベイク時間とメモリ使用量が大幅に増加することに注意する必要があります。さらに、ランタイムに間接光をインタラクティブに更新すると、CPU に負担がかかります。また、ベイクとリアルタイム GI システムが作成する間接光を視覚的に比較すると、両システムは間接光をシミュレートするのに異なるテクニックを使用し、しばしば著しく異なる解像度で操作することがあるため、矛盾が生じる場合があります。
両方の GI システムを使用することは、ハイエンドプラットフォームや、コストが予測可能でシーンを厳密に制御できるプロジェクトに制限する必要があります。このアプローチは、両方のシステムの管理は著しく複雑さを増すため、すべてのライティング設定を深く理解している熟練ユーザーのみに適しています。結果的に、2 つの GI システムのうちの 1 つを使用することが、通常、ほとんどのプロジェクトにとってより安全な方法と言えます。両方のシステムを使用することは、ほとんどの場合、推奨されません。
Light コンポーネントの Mode プロパティは、混乱しやすい共通のソースです。
Light インスペクター には 3 つの ライトモードが あります。
ライトのモードは Baked Global Illumination システムが有効になっている場合にのみ関係することに注意してください。GI システムを使用しない場合、またはリアルタイム GI システムのみを使用する場合、すべてのベイクされたライトと混合ライトは、Mode プロパティが Realtime に設定されているかのように動作します。
以下の図は、フローチャートと比較表を組み合わせたものです。新しいライトがシーンに追加されるたびに適切なライトモードを決定するのに役立ちます。
上の図からわかるように、シーンのすべての Mixed (混合) ライトには、Lighting ウィンドウで選択したライティングモードに応じて、特定のベイク機能とリアルタイム機能があります。
3 つのモードから選択できます。
Shadowmask ライティングモードには 2 つの品質設定があります。
HDRP の シャドウマスクライティングモード を使用する場合、シャドウマスク機能は Graphics 設定で割り当てられた HDRP アセットで有効です。次に、Frame Settings を使用してカメラに対して有効にする必要があります。
以下の表は、Unity 2019.3 の各レンダーパイプラインがサポートする機能の概要です。
レンダリングパイプラインと主なライティング機能を説明したので、いくつかのプロジェクトの例で、どの設定をライトに使用するかを見てみましょう。すべてのプロジェクトはそれぞれ独特であるため、要件に応じて若干異なるオプションを使用する場合があります。
プロトタイプの作成に頻繁にAsset Store を使用している場合は、ストアにあるほとんどのアセットが HDRP と URP と完全に互換性があるわけではないため、ビルトインレンダーパイプラインのみが適切なレンダリングパイプラインになります。それでも、アセットの互換性は時間の経過とともに向上します。すべてのアセットを基礎から構築していて、すでにそのプロジェクトの要件を明確に理解している場合は、2 つの SRP (URP か HDRP) のうち 1 つを選択するか、カスタムのものを作成します。
(事前) 制作の初期段階にあり、ライティングに迅速な転換や最大級の柔軟性が必要な場合は、事前計算を必要としない完全なリアルタイムの方法を好むかもしれません。そのため、ベイクされた GI とリアルタイム GI の両方をオフにします。適切な間接光の不足を緩和するためには、Screen Space Ambient Occlusion を有効にします。これは、コストが低いリアルタイムのコンタクトシャドウを提供することで、シーン内のオブジェクトの接地感を出すのに役立ちます 。
モバイルデバイスをターゲットにしている場合、URP は戦略ゲームの安定したパフォーマンスを確保するための大きな助けになります。ゲームに合わせてレンダリングパイプラインをカスタマイズする必要がある場合は、グラフィックスプログラマーは URP をすぐに拡張するでしょう。URP を選択し、Baked GI を使用する場合は、現在、Shadowmask Mixed Lighting Mode はサポートされていないことに注意してください。
また、Asset Stoere から多くのアセットを使用するなど、古いビルトインレンダリングパイプラインを引き続き使用する場合は、すべてのグローバルの Mixed ライティングモードがサポートされます。この場合、Shadowmask ライティングモードを使用するとベイクしたシャドウが提供され、動的オブジェクトがリアルタイムのシャドウを投影することが可能です。プロジェクトでシャドウマスクのコストが高すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。
リニアの 1 人称シューティングゲームで PC やコンソール用に優良画質のビジュアルを目指す場合は、HDRP が望ましいレンダリングパイプラインと言えます。また、グラフィックスプログラマーの助けを借りて、カスタムの SRP を開発することもできます。
レベルに多くのリアルタイムのシャドウを投影するライト (例えば、破壊可能なライトの小道具や動くライト) がある場合、Baked GI システムを Baked Indirect モードで使用すると、静的ライトプロパティの混合ディレクショナルライトとベイクしたライトからの間接光がきれいに見えるようになります。レベルに高い割合で固定された投影ライトのプロパティが含まれる場合は、シャドウマスクを使用する方法がお勧めです。なぜなら、HDRP は素晴らしいハイブリッドの Shadowmask モードを提供して、リアルタイムシャドウとベイクシャドウのブレンドをより細かく制御できるからです。
Nintendo Switch もサポートする場合は、URP を使用することをお勧めします。これにより、市場に出回っているほとんどのゲームプラットフォームをサポートすることができ、プロジェクトを HDRP から URP に、またはその逆に変換するという面倒な処理を行う必要がありません。
PC やコンソール用に大規模な環境と完全に動的なライティングを特徴とするバトルロイヤルゲームをリリースする場合は、HDRP を選択するか、プロジェクトにレンダリングパイプラインを合わせるために HDRP を拡張する必要があります。質の高い視覚的忠実度を目指すのではなく、モバイルデバイスや低仕様のシステムをターゲットにしている場合は、URP を検討することもできます。
HDRP と URP はリアルタイム GI システム (Enlighten) をサポートしていません。そのため、昼夜のサイクルに対応するために Indirect Bake と、例えば、1 日を通して太陽と間接光を調節するようなカスタム性のスクリプトを使って処理する必要があります。
この特定のシナリオでは、Realtime GI とBaked GIシステムの両方をアクティブにすることはお勧めできません。なぜなら、パフォーマンスとシーン管理に重大なレベルの多大なオーバーヘッドが発生するからです。GI システムを両方使用することに対するもうひとつの議論は、このような大規模なマルチプレイヤーゲームの予測不可能な性質です。例えば、パフォーマンスの見積もりは、スクリプティングを多く使用したシングルプレイヤーの冒険よりもさらに困難です。
スクリプタブルレンダーパイプラインが導入されたことで、Unity のレンダリング環境は著しく変化しました。したがって、ライティングパイプラインのためのこれらのすべての変更とそれらの影響に追いつくことは、大変な作業です。
このガイドと多くの図が各レンダリングパイプライン の機能をよりよく理解する助けとなり、みなさんが Unity のプロジェクトを確実に適切な設定で自信をもってライティングできるよう願っています。
Unity のライティングとレンダリングパイプラインの詳細については、以下の記事を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.