このガイドは 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 で利用可能なグローバルイルミネーションシステム (Global Illumination systems) は以下の通りです。
リアルタイムグローバルイルミネーション: このシステムは、サードパーティのミドルウェアソリューションである Enlighten をベースにしています。事前計算を行い、ContributeGI 設定を有効にしてシーン内のゲームオブジェクトを変更しない場合は、リアルタイムでライティングを調整できます。
Baked Global Illumination: When you select this system, Unity uses the Progressive Lightmapper (CPU or GPU) to bake lighting data into Light Probes, textures called lightmaps, and Reflection Probes.
プログレッシブライトマッパーは、パストレーシングを使用して間接照明の値を計算します。シーン ビューカメラから見えるオブジェクトに影響するライトの事前計算を優先できます。ライトマップの一部のライティングだけを更新すると全体のベイク時間が長くなりますが、より速くライティングデザインを反復することができます。
スクリプタブルレンダーパイプラインに固有の互換性情報については、レンダーパイプライン機能の比較 を参照してください。比較表で指定されていない限り、ビルトインレンダーパイプラインはこの記事で説明するすべての機能をサポートします。
どのような GI システムを使用する場合でも、ライティングのベイク/事前計算の際に、 “Contribute GI” とマーク付けされたオブジェクトのみが考慮されます。動的な (つまり静的でない) オブジェクトは、間接光を受けるためにシーン全体に配置したライトプローブに依存します。
ライトのベイク/事前計算は比較的遅いプロセスなので、凹面やセルフシャドウなど、明確なライティングの変化を伴う大規模で複雑なアセットのみを “Contribute GI” としてマーク付けすべきです。均一なライティングを受ける小さい凸状のメッシュは “Contribute GI” として扱うべきではありません。したがって、よりシンプルなライトの近似を格納する ライトプローブ から間接光を受ける必要があります。大きい動的オブジェクトは、より局部化された間接光を受けるために LPPV を使用することができます。シーン内で “Contribute GI” とマーク付けするオブジェクト数を制限することは、適切なライト品質を維持しながらベイク時間を最短にするためにとても重要です。最適化のプロセスとプローブライティングの重要性については チュートリアル を参照してください。
Unity エディターとプレイヤーでは、Enlighten リアルタイムグローバルイルミネーションとベイクしたライティングの両方を同時に使用することができます。
ただし、これらの機能を同時に有効にすると、同じデータセットを使用しないため、ベイク時間やランタイム時のメモリ使用量が大幅に増加します。ベイクした間接光と Enlighten リアルタイムグローバルイルミネーションで提供される間接光は、ベイクに使用するライトマッパーに関係なく、視覚的な違いがあることが予想されます。これは、Enlighten リアルタイムグローバルイルミネーションが Unity のベイクバックエンドと大きく異なる解像度で動作し、間接光をシミュレートするために異なるテクニックに依存しているためです。
Enlighten リアルタイムグローバルイルミネーションとベイクしたライティングの両方を同時に使用する場合は、ハイエンドなプラットフォームや、予測可能なコストで厳密に制御されたシーンのプロジェクトに限定してください。この方法を効果的に使用できるのは、すべてのライティング設定を熟知している上級のユーザーのみです。したがって、ほとんどのプロジェクトでは、2 つのグローバルイルミネーションシステムのうち 1 つを選択する方が、通常は安全な戦略であると言えます。両方のシステムの使用が推奨されるケースはほとんどありません。
Light コンポーネントの Mode プロパティは、混乱しやすい共通のソースです。
Light インスペクター には 3 つの ライトモードが あります。
ライトのモードはベイクしたグローバルイルミネーション (GI) システムが有効になっている場合にのみ影響することに注意してください。GI システムを使用しない場合、または Enlighten リアルタイム GI システムのみを使用する場合、すべてのベイクされたライトと混合ライトは、Mode プロパティが Realtime に設定されているかのように動作します。
以下の図は、フローチャートと比較表を組み合わせたものです。新しいライトがシーンに追加されるたびに適切なライトモードを決定するのに役立ちます。
上の図からわかるように、シーンのすべての Mixed (混合) ライトには、Lighting ウィンドウで選択したライティングモードに応じて、特定のベイク機能とリアルタイム機能があります。
3 つのモードから選択できます。
Shadowmask ライティングモードには 2 つの品質設定があります。
HDRP の シャドウマスクライティングモード を使用する場合、シャドウマスク機能は Graphics 設定で割り当てられた HDRP アセットで有効です。次に、Frame Settings を使用してカメラに対して有効にする必要があります。
スクリプタブルレンダーパイプラインに固有の互換性情報については、レンダーパイプライン機能の比較 を参照してください。比較表で指定されていない限り、ビルトインレンダーパイプラインはこの記事で説明するすべての機能をサポートします。
レンダリングパイプラインと主なライティング機能を説明したので、いくつかのプロジェクトの例で、どの設定をライトに使用するかを見てみましょう。すべてのプロジェクトはそれぞれ独特であるため、要件に応じて若干異なるオプションを使用する場合があります。
プロトタイプの作成に頻繁にAsset Store を使用している場合は、ストアにあるほとんどのアセットが HDRP と URP と完全に互換性があるわけではないため、ビルトインレンダーパイプラインのみが適切なレンダリングパイプラインになります。それでも、アセットの互換性は時間の経過とともに向上します。すべてのアセットを基礎から構築していて、すでにそのプロジェクトの要件を明確に理解している場合は、2 つの SRP (URP か HDRP) のうち 1 つを選択するか、カスタムのものを作成します。
(事前) 制作の初期段階にあり、ライティングに迅速な転換や最大級の柔軟性が必要な場合は、事前計算を必要としない完全なリアルタイムの方法を好むかもしれません。そのため、ベイクされた GI と Enlighten リアルタイム GI の両方をオフにします。適切な間接光の不足を緩和するためには、Screen Space Ambient Occlusion を有効にします。これは、コストが低いリアルタイムのコンタクトシャドウを提供することで、シーン内のオブジェクトの接地感を出すのに役立ちます 。
モバイルデバイスをターゲットにする場合、URP はゲームの確かなパフォーマンスを確保するために素晴らしい候補となり得ます。グラフィックスプログラマーの助けを借りれば、多くの場合、ゲーム固有のニーズに合わせて URP をカスタマイズすることが可能です。
ビルトインレンダー パイプラインと URP はどちらもシャドウマスクライティングモードをサポートしており、これにより、動的オブジェクトがリアルタイムシャドウを作るようにしながら、静的オブジェクトのシャドウをベイク処理できるようになります。 シャドウマスクがプロジェクトにとって高負荷すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。
リニアの 1 人称シューティングゲームで PC やコンソール用に優良画質のビジュアルを目指す場合は、HDRP が望ましいレンダリングパイプラインと言えます。また、グラフィックスプログラマーの助けを借りて、カスタムの SRP を開発することもできます。
レベルに多くのリアルタイムのシャドウを投影するライト (例えば、破壊可能なライトの小道具や動くライト) がある場合、ベイクした GI システムを Baked Indirect モードで使用すると、静的ライトプロパティの混合ディレクショナルライトとベイクしたライトからの間接光がきれいに見えるようになります。レベルに高い割合で固定された投影ライトのプロパティが含まれる場合は、シャドウマスクを使用する方法がお勧めです。なぜなら、HDRP は素晴らしいハイブリッドの Shadowmask モードを提供して、リアルタイムシャドウとベイクシャドウのブレンドをより細かく制御できるからです。
Nintendo Switch もサポートする場合は、URP を使用することをお勧めします。これにより、市場に出回っているほとんどのゲームプラットフォームをサポートすることができ、プロジェクトを HDRP から URP に、またはその逆に変換するという面倒な処理を行う必要がありません。
PC やコンソール用に大規模な環境と完全に動的なライティングを特徴とするバトルロイヤルゲームをリリースする場合は、HDRP を選択するか、プロジェクトにレンダリングパイプラインを合わせるために HDRP を拡張する必要があります。質の高い視覚的忠実度を目指すのではなく、モバイルデバイスや低仕様のシステムをターゲットにしている場合は、URP を検討することもできます。
この特定のシナリオでは、Enlighten のリアルタイムグローバルイルミネーションとベイクしたグローバルイルミネーションシステムの両方をアクティブにすることは推奨されません。なぜなら、パフォーマンスとシーン管理に重大なレベルの多大なオーバーヘッドが発生する恐れがあるからです。グローバルイルミネーションシステムを両方使用することに対するもうひとつの議論は、このような大規模なマルチプレイヤーゲームの予測不可能な性質です。例えば、パフォーマンスの見積もりは、スクリプティングを多く使用したシングルプレイヤーの冒険よりもさらに困難です。
スクリプタブルレンダーパイプラインが導入されたことで、Unity のレンダリング環境は著しく変化しました。したがって、ライティングパイプラインのためのこれらのすべての変更とそれらの影響に追いつくことは、大変な作業です。
このガイドと多くの図が各レンダリングパイプライン の機能をよりよく理解する助けとなり、みなさんが Unity のプロジェクトを確実に適切な設定で自信をもってライティングできるよう願っています。
Unity のライティングとレンダリングパイプラインの詳細については、以下の記事を参照してください。