最初に、このガイドで頻繁に登場するいくつかの重要なグラフィックスレンダリング用語の定義を見てみましょう。
シェーダー はグラフィックス処理ユニット (GPU) で実行されるプログラムや一群のプログラムの総称です。例えば、カリング段階が完了した後、頂点シェーダーを使用して、可視オブジェクトの頂点座標を「オブジェクト空間」から「クリップ空間」と呼ばれ異なる空間に変換します。それから、GPU はこの新しい座標を使用して、シーンをラスタライズ、すなわち、シーンのベクトル表現を実際のピクセルに変換します。後の段階で、これらのピクセルはピクセルシェーダー (またはフラグメントシェーダー) で色付けされます。ピクセル色は、一般に、それぞれの表面のマテリアルの特性と周囲のライトに依存します。最近のハードウェア上で利用可能なもう 1 つのシェーダーは、コンピュートシェーダー です。これを利用すると、ライトカリング、パーティクル物理特性、体積シミュレーションなど、あらゆる種類の数学的演算に GPU の強力な並列処理能力を活用することができます。
間接光 はライトが表面に反射し、大気や半透明なマテリアルなどの媒質を透過して散乱することによって発生します。このような条件下では、遮蔽物は一般的にぼんやりした、または識別できないシャドウを投影します。
次のフローチャートは、コンテンツ作成者の視点で、Unity のすべてのライティングパイプライン全体を高レベルから見たものです。
まず、レンダリングパイプラインを選択します。次に、間接光をどのように生成するかを決定し、それに応じてグローバルイルミネーション (GI) システムを選択します。すべてのグローバルライティング設定がプロジェクトに適切に調整されていることを確認した後、ライト、エミッシブサーフェス、リフレクションプローブ、ライトプローブ、Light Probe Proxy Volume (LPPV) を加えます。これらすべてのライティングオブジェクトの使用法や機能の詳細はこのページのスコープを超えています。ですから、マニュアルのライティングのセクションを読んで、プロジェクトで正しく活用する方法を学ぶことをお勧めします。
2018 年の初めまで、Unityには 1 つのレンダリングパイプラインしかありませんでした。これは Built-In Render Pipeline (ビルトインレンダリングパイプライン) と名前が変更されました。このレンダラーでは、フォワード (Forward) レンダリングとディファード (Deferred) レンダリングの選択ができます。
2018 年 1 月に、スクリプタブルレンダーパイプライン (Scriptable Render Pipeline、SRP) を発表しました。これを利用すると、C# スクリプティングを使用してレンダリングループをカスタマイズすることができます。実際、これはゲームエンジンの分野での小さな革命です。ユーザーはついに、C++ のような低レベルのプログラミング言語を使用せずに、オブジェクトのカリング、描画、フレームのポストプロセスをパーソナライズすることができるようになりました。
現在 Unity は、最近多く使用されるハードウェアのためにパフォーマンスを念頭に置いて設計された 2 つのプレビュー SRP を提供しています。
タイルはフレームの小さな 2 次元の正方形のピクセル範囲であり、クラスターはカメラの錐台内部の 3 次元ボリュームです。タイルとクラスターのレンダリング技術は両方とも、個々のタイルとクラスターに影響を与えるすべてのライトのリストに依存しています。タイルやクラスターのライティングは、それから、既知のライトの対応リストを使って 1 回のパスで計算されます。不透明なオブジェクトはタイルシステムを使用してシェーディングされることが最も一般的ですが、透明なオブジェクトはクラスターシステムを利用します。このレンダラーが提供する主な利点は、ビルトインレンダリングパイプライン (ディファード) と比較して、ライティングの処理が高速で、帯域幅消費が大幅に削減されることです。ビルトインレンダリングパイプラインは、ずっと時間のかかるマルチパスのライト集積を利用しています。
下のフローチャートを使用すると、いくつかの重要な基準に基づいてどのレンダリングパイプラインを選択すべきかがすぐにわかります。
HDRP と LWRP の最新バージョンは Unity Package Manager (Window > Package Manager) からダウンロードできます。これらの SRP の 1 つを開始するもっとも簡単な方法は、Unity Hub で対応するテンプレートの 1 つを使用して新しいプロジェクトを作成することです。
HDRP か LWRP 用にプロジェクトを手動で設定したい場合は、必要なパッケージがインストールされていることを確認してください。次に、Create > Rendering > High Definition Render Pipeline Asset で、Project ウィンドウに新しいアセットを作成します。このアセットを Graphics Settings にドラッグします。 HDRP を選択した場合は、プラットフォームの Player 設定でリニア色空間 (Color Space の Linear) が選択されていることを確認し、シーンに Rendering > Scene Settings オブジェクトを加えます。
Graphics の Project Settings ウィンドウでパイプラインアセットが割り当てられていない場合、Unity はデフォルトのビルトインレンダリングパイプラインを使用します。
レンダリングに関する知識があり C#に精通していて、プロジェクトのレンダラーの完全な調整が必要な場合は、是非、カスタムのスクリプタブルレンダーパイプラインを作成する SRP の概念を試してみると良いでしょう。LWRP はシェーダーライブラリが小さく、レンダリングパスを簡単に挿入、除去、スワップすることができるため、特に拡張が容易です。
プロジェクトのマテリアルをビルトインレンダリングパイプラインから HDRP か LWRP に変換するのは、Edit > Render Pipeline > Upgrade… の 1 クリックマテリアルコンバーターのおかげで比較的簡単です。ただし、それは不可逆的な操作であることに注意してください。事前にプロジェクトをバックアップすることを強くお勧めします。
それでも、カスタムシェーダーは手作業で変更する必要があるため、ビルトインレンダリングパイプラインから HDRP または LWRP への移行は、書き直す必要があるカスタムシェーダーの数に応じて、時間がかかる場合があります。
さらに、HDRP はビルトインレンダリングパイプラインよりも物理的に正確であるため (特に光の減衰と分布に関しては)、HDRP に切り替えた後にプロジェクトが同じように見えると期待すべきではありません。
さらに、HDRP と LWRP は同じレンダリング機能を共有しないため、相互互換性はありません。プロジェクトを HDRP から LWRP に、またはその逆に変換することは可能ですが、1 クリック操作ではなく、ライティング、マテリアル、シェーダーを手動で再処理する必要があります。
最後に、HDRP と LWRP はまだプレビュー中であり、プロダクション用の使用がすぐに可能になるように、全力で作業中です。両方のパイプラインで、すべての機能がまだ実装されているわけではないことに注意してください。例えば、以下で詳述する特定のライティングモードは、LWRP ではまだ完全には使用できません。また、XR は HDRP によって適切にサポートされていません。
Unityでは 2 つのグローバルイルミネーション (GI) システムが利用可能です。これらはWindow > Rendering > Lighting Settings で有効にすることができます。
(事前計算された) リアルタイム GI: このシステムは、サードパーティのライティングミドルウェアである Enlighten に完全に依存しています。Unity の事前計算の間、Enlighten はいろいろ処理がありますが、クラスタリングとライトトランスポートの 2 つの重い処理を行います。1 つ目は、シーンをクラスターと呼ばれるサーフェスパッチの集合に単純化することであり、2 つ目は、これらのクラスター間の可視性を計算することです。この事前計算されたデータは、インタラクティブに間接ライトを生成するためにランタイムに使用されます。Enlighten の強みはライトをリアルタイムで編集する能力に依存します。事前計算されるデータはクラスター間の関係に依存するためです。ただし、他の従来のライトマップ技法と同様に、シーンの静的ジオメトリを編集すると新しい事前計算が発生します。
Baked Global Illumination (ベイクした GI): ライトは、ライトマップと呼ばれるテクスチャとライトプローブにベイクされます。ベイクされた GIシステムでは、以下のライトマッパーの 1 つを使用します。
プログレッシブライトマッパーは、シーン全体のすべてのベイク時間を増加させる代わりに、カメラから見えるオブジェクトのライティング計算を優先し、ライティングのイテレーションを大幅に高速化します。プログレッシブライトマッパーは CPU を使用してパストレースで間接光を計算します。新しい GPU プログレッシブライトマッパー は現在開発中で、シーンのベイク時間を著しく短縮します。
Enlighten とプログレッシブライトマッパーはどちらもベイクしたライトを作成するために異なる方法を使用しているため、結果のライトを比較すると正確に同じとは限りません。
下の図を見て、どのような GI システムがプロジェクトに適しているか、またその主な長所と短所を判断してください。
どのような GI システムを使用する場合でも、ライティングのベイク/事前計算の際に、Lightmap Static とマーク付けされたオブジェクトのみが考慮されます。動的な (つまり静的でない) オブジェクトは、間接光を受けるためにシーン全体に配置したライトプローブに依存します。
ライトのベイク/事前計算は比較的遅いプロセスなので、凹面やセルフシャドウなど、明確なライティングの変化を伴う大規模で複雑なアセットのみを Lightmap Static としてマーク付けすべきです。均一なライティングを受ける小さい凸状のメッシュは静的なものとして扱うべきではありません。したがって、よりシンプルなライトの近似を格納する ライトプローブ から間接光を受ける必要があります。大きい動的オブジェクトは、より局部化された間接光を受けるために LPPV を使用することができます。シーン内で Lightmap Static とマーク付けするオブジェクト数を制限することは、適切なライト品質を維持しながらベイク時間を最短にするためにとても重要です。最適化のプロセスとプローブライティングの重要性については チュートリアル を参照してください。
Unity ではベイクされた GI システムとリアルタイム GI システムの両方を同時にアクティブにすることができ、これによりすべてのライティング機能にアクセス可能です。ただし、両方のシステムを有効にすると、同じデータセットに依存しないため、ランタイム時のベイク時間とメモリ使用量が大幅に増加することに注意する必要があります。さらに、ランタイムに間接光をインタラクティブに更新すると、CPU に負担がかかります。また、ベイクとリアルタイム GI システムが作成する間接光を視覚的に比較すると、両システムは間接光をシミュレートするのに異なるテクニックを使用し、しばしば著しく異なる解像度で操作することがあるため、矛盾が生じる場合があります。
両方の GI システムを使用することは、ハイエンドプラットフォームや、コストが予測可能でシーンを厳密に制御できるプロジェクトに制限する必要があります。このアプローチは、両方のシステムの管理は著しく複雑さを増すため、すべてのライティング設定を深く理解している熟練ユーザーのみに適しています。結果的に、2 つの GI システムのうちの 1 つを使用することが、通常、ほとんどのプロジェクトにとってより安全な方法と言えます。両方のシステムを使用することは、ほとんどの場合、推奨されません。
ライトのモードは、よくある混乱の原因となります。最も重要なことは、ライトのモードは Baked Global Illumination が有効になっている場合にのみ関係があります。
Light インスペクターには 3 つのモードがあります。
GI システムを使用しない場合や、Realtime GI システムのみを使用する場合は、Baked と Mixed のライトはすべて Realtime にオーバーライドされます。
以下の図は、フローチャートと比較表を組み合わせたものです。新しいライトがシーンに追加されるたびに適切なライトモードを決定するのに役立ちます。
上の図で分かるように、Mixed ライトは Rendering > Lighting Settings ウィンドウで選択したグローバルの Mixed Lighting モードに応じて、特定のベイクとリアルタイムの機能を持っています。
4 つのモードから選択できます。
Shadowmask Mode と Shadow Distance は Edit > Project Settings > Quality で調整できます。HDRP を使用する場合、Graphics 設定で割り当てた HDRenderPipelineAsset で Shadowmask モードが有効になります。シャドウの Max Distance は Scene Settings オブジェクトで設定できます。
HDRP は新しいハイブリッドシャドウマスクモードをサポートしています。追加設定の Non Lightmapped Only チェックボックスでリアルタイムシャドウを投影するかどうかを制御できます。このパラメーターを使用すると、カメラがライトの Fade Distance 内にある場合はライトがリアルタイムの動的なシャドウを投影します。そうでない場合は、ベイクしたシャドウマスクに戻ります。 HDRP のこの新しいモードの主な利点は、リアルタイムのシャドウの代わりに、メインのディレクショナルライトに使用される Shadow Distance 内の特定のライトにベイクしたシャドウマスクを使用できることです。
LWRP と HDRP はまだプレビュー中です。つまり、エキサイティングな新機能が導入される一方、ビルトインパイプラインが提供するある機能をまだサポートしていないかもしれません。また、ある機能のサポートが中止される可能性があります。以下の表は、Unity 2018.3 のライトのパイプラインの現状況の概略です。
レンダリングパイプラインと主なライティング機能を説明したので、いくつかのプロジェクトの例で、どの設定をライトに使用するかを見てみましょう。すべてのプロジェクトはそれぞれ独特であるため、要件に応じて若干異なるオプションを使用する場合があります。
プロトタイプの作成に頻繁にAsset Store を使用している場合は、ストアで見つかるほとんどのアセットが HDRP と LWRP と完全に互換性があるわけではないため、ビルトインレンダリングパイプラインのみが適切なレンダリングパイプラインになります。それにもかかわらず、アセットの互換性は時間の経過とともに向上します。すべてのアセットを基礎から構築していて、すでにプロジェクトの要件を明確に理解している場合は、2 つの SRP (LWRP か HDRP) の 1 つを選択するか、カスタムのものを作成します。
製作作業やプリプロダクションの初期段階で、ライティングの迅速な転換や最大級の柔軟性が必要な場合は、事前計算を必要としない完全なリアルタイムの方法が便利な場合があります。そのため、ベイクされた GI とリアルタイム GI の両方をオフにします。適切な間接光の不足を緩和するために、Post Processing Stack V2 の Screen Space Ambient Occlusion (スクリーンスペースアンビエントオクルージョン) を有効にします。スクリーンスペースアンビエントオクルージョンは、コストが低いリアルタイムのコンタクトシャドウで、シーン内のオブジェクトの接地感を出すのに役立ちます。
モバイルデバイスをターゲットにしている場合、LWRP は戦略ゲームの安定したパフォーマンスを確保するための大きな助けになります。ゲームに合わせてレンダリングパイプラインをカスタマイズする必要がある場合は、グラフィックスプログラマーは LWRP を簡単に拡張することができます。
LWRPを選択し、Baked GI を使用する場合は、現在、Mixed Lighting には Subtractive ライティングモードのみが使用可能であることに注意してください。 Baked Indirect と Shadowmask のサポートは、後のリリースで追加されます。
また、Asset Stoere から多くのアセットを使用するなど、古いビルトインレンダリングパイプラインを引き続き使用する場合は、すべてのグローバルの Mixed ライティングモードがサポートされます。この場合、Shadowmask ライティングモードを使用するとベイクしたシャドウが提供され、動的オブジェクトがリアルタイムのシャドウを投影することが可能です。プロジェクトでシャドウマスクのコストが高すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。
リニアの 1 人称シューティングゲームで PC やコンソール用に優良画質のビジュアルを目指す場合は、HDRP をレンダリングパイプラインに使用すべきです。また、グラフィックスプログラマーの助けを借りて、カスタムの SRP を開発することもできます。
レベルに多くのリアルタイムのシャドウを投影するライト (例えば、破壊可能なライトの小道具や動くライト) がある場合、Baked GI システムを Baked Indirect モードで使用すると、静的ライトプロパティーの混合ディレクショナルライトとベイクしたライトからの間接光がきれいに見えるようになります。レベルに高い割合で固定された投影ライトのプロパティーが含まれる場合は、シャドウマスクを使用する方法がお勧めです。なぜなら、HDRP は素晴らしいハイブリッドの Shadowmask モードを提供して、リアルタイムシャドウとベイクシャドウのブレンドをより細かく制御できるからです。
このタイプのリニアゲームは一般に、パフォーマンスとメモリ消費の観点から非常に予測可能であるため、ベイクした GI とリアルタイムの GI システムの両方を同時にアクティベーションできます。ただし、GI のセクション で説明しているように、両方のシステムを同時に使用すると、パフォーマンスコストとベイクにかかる時間が大幅に増加します。すべての技術に精通している専門的知識のあるユーザーのみが使用してください。
PC やコンソール用に大規模な環境と完全に動的なライティングを特徴とするバトルロイヤルゲームをリリースする場合は、HDRP を選択するか、プロジェクトにレンダリングパイプラインを合わせるために HDRP を拡張する必要があります。質の高い視覚的忠実度を目指すのではなく、モバイルデバイスや低仕様のシステムをターゲットにしている場合は、LWRP を検討することもできます。
昼夜のサイクルに対応するために、HDRP を選択した場合、Realtime GI システムをアクティブにして、1 日の間の任意の時間の間接光をシミュレートする必要があります。特定の密集した状態で光を受ける内部でパフォーマンスを最大限に上げるには、Realtime GI システムが特定のライトを無視してレンダリングコストがかからないようにするように、特定のライトの Indirect Multiplier を 0 に設定します。
LWRP は Realtime GI システムをサポートしていません。例えば、昼夜のサイクルは、1 日を通した太陽と環境光の色の変化をカスタムスクリプトで処理する必要があります。
この特定のシナリオでは、Realtime GI とBaked GIシステムの両方をアクティブにすることはお勧めできません。なぜなら、パフォーマンスとシーン管理に重大なレベルの多大なオーバーヘッドが発生するからです。GI システムを両方使用することに対するもうひとつの議論は、このような大規模なマルチプレイヤーゲームの予測不可能な性質です。例えば、パフォーマンスの見積もりは、スクリプティングを多く使用したシングルプレイヤーの冒険よりもさらに困難です。
スクリプタブルレンダーパイプラインが導入されたことで、Unity のレンダリング環境は著しく変化しました。したがって、ライティングパイプラインのためのこれらのすべての変更とそれらの影響に追いつくことは、大変な作業です。
このガイドと多くの図が各レンダリングパイプライン の機能をよりよく理解する助けとなり、みなさんが Unity のプロジェクトを確実に適切な設定で自信をもってライティングできるよう願っています。
Unity のライティングとレンダリングパイプラインの詳細については、以下の記事を参照してください。