Version: 2020.1
言語: 日本語
Believable visuals: dynamic lighting
物理演算

Unity でレンダリングパイプラインとライティングを設定する

このガイドは Unity ブログ Spotlight チームのベストプラクティス - ライティングパイプラインのセットアップ - Pierre Yves Donzallaz を更新したものです。

定義

最初に、このガイドで頻繁に登場するいくつかの重要なグラフィックスレンダリング用語の定義を見てみましょう。

  • レンダリングパイプライン は、シーンのオブジェクトがどのように表示されるかを 3 つの主要な段階で決定します。
    • 最初のステップはカリングです。これは、レンダリングする必要のあるオブジェクト、できれば、カメラに見えるオブジェクト (錐台カリング) と他のオブジェクトによって隠されていないオブジェクト (オクルージョンカリング) を列挙します。
    • 2 番目のステップはレンダリングです。これらのオブジェクトを、適切なライティングといくつかのプロパティとともに、ピクセルベースのバッファに描画することです。
    • 最後に、これらのバッファに対してポストプロセス操作を実行します。例えば、カラーグレーディング、ブルーム、被写界深度を適用して、ディスプレイデバイスに送信する最終的な出力フレームを生成します。

これらの操作は、フレームレートに応じて、1 秒間に何度も繰り返されます。

  • シェーダーはプログラムや一群のプログラムの総称で、グラフィックス処理ユニット (GPU) で実行されます。例えば、カリング段階が完了した後、頂点シェーダーを使用して、可視オブジェクトの頂点座標を “オブジェクト空間” から “クリップ空間” と呼ばれ異なる空間に変換します。GPU はこの新しい座標を使用して、シーンをラスタライズします。すなわち、シーンのベクトル表現を実際のピクセルに変換します。後の段階で、これらのピクセルはピクセルシェーダー (またはフラグメントシェーダー) で色付けされます。ピクセル色は、一般に、それぞれのサーフェスのマテリアル特性と周囲のライトに依存します。最近のハードウェア上で利用可能なもう 1 つの一般的なシェーダーは、コンピュートシェーダー です。これを利用すると、ライトカリング、パーティクル物理特性、ボリュメトリックシミュレーションなど、あらゆる種類の数学的演算に GPU の強力な並列処理能力を活用することができます。
  • 直接光は、電球などのような自発光型の光源が発するライトを意味し、サーフェスからライトがバウンスした結果のライトではありません。光源のサイズと受光側までの距離に応じて、このようなライトは通常、くっきりとした影を生成します。
    • 直接光とディレクショナルライトを混同しないようにしてください。ディレクショナルライトは、無限に離れた光源 (例えば、コンピューターでシミュレーションされた太陽) から放出される光です。ディレクショナルライトの目立った特性は、シーン全体を平行な光線でカバーできることと、距離減衰 (または光減衰) がないことです。つまり、光源への距離が増加しても受ける光の量は減衰しません。
    • 実際には、太陽光はライトの他のソースと同様に、逆 2 乗の法則に基づいて、距離と共に減衰します。簡単に言えば、受光側と光源との間の距離を増加すると、受光量は急速に低下します。例えば、水星での太陽の照度は地球上のほぼ 7 倍 で、火星では地球の約半分の太陽光、冥王星は 0.06 % の太陽光にすぎません。それにもかかわらず、高度範囲が非常に限られている大抵のリアルタイムのアプリケーションでは、太陽光の減衰は重要ではありません。したがって、ディレクショナルライトは、巨大な惑星中心のオープンワールドなども含め、大抵の Unity シーンで太陽光をシミュレーションするのにまったく問題ありません。
  • 間接光は光がサーフェスに反射し、大気や半透明なマテリアルなどの媒体を通じて拡散することによって発生します。このような条件下では、遮蔽物は一般的にぼんやりした、または識別できない影を投影します。
  • グローバルイルミネーション (GI) は、直接ライティングと間接ライティングの両方をモデルとして、現実的なライティングを得る一群のテクニックです。GI には、ベイクした/動的なライトマップ、放射照度のボリューム、光伝播ボリューム、ベイクした/動的なライトプローブ、ボクセルベースの GI、距離フィールドベースの GI などいくつかの方法があります。Unity は、ベイクした/動的なライトマップとライトプローブをサポートします。
  • ライトマッパー は基本的なシステムで、光線を射影し、ライトバウンスを計算し、結果のライティングをテクスチャに適用することによって、ライトマップとライトプローブのデータを生成します。したがって、ライトマッパーが異なると、ライトのデータの生成に異なる技術を使用することがあるため、異なったライティングの外観を生成する場合があります。

概要

次のフローチャートは、コンテンツ作成者の視点で、Unity のすべてのライティングパイプライン全体を高レベルから見たものです。

まず、レンダリングパイプラインを選択します。次に、間接光をどのように生成するかを決定し、それに応じてグローバルイルミネーション (GI) システムを選択します。すべてのグローバルライティング設定がプロジェクトに適切に調整されていることを確認した後、ライトエミッシブサーフェスリフレクションプローブライトプローブLight Probe Proxy Volume (LPPV) を加えます。これらすべてのライティングオブジェクトの使用法や機能の詳細はこのページのスコープを超えています。ですから、マニュアルのライティングのセクションを読んで、プロジェクトで正しく活用する方法を学ぶことをお勧めします。

レンダリングパイプライン

2018 年の初めまで、Unity で使用できるレンダリングパイプラインは ビルトインレンダーパイプライン 1 つだけでした。このレンダリングパイプラインでは、フォワードとディファードの レンダリングパス が選択できます。

  • (マルチパス) フォワードレンダリングパス を使用すると、シーン内のすべてのオブジェクトが 1 つずつ順番にレンダリングされます。各オブジェクトに影響を与えるライトの数に応じて、それが複数のパスで行われる可能性があります。そのため、そのレンダリングコストは、オブジェクトが複数のライトによって照らされると著しく増加します。このタイプのレンダラーは一般的に、さまざまなシェーダーを提供し、簡単に透明度を処理できます。
  • ディファードレンダリングパス を使用すると、すべての (不透明な) ジオメトリが最初にバッファにレンダリングされ、バッファはマテリアルに関する情報 (カラー、スペキュラー、スムースネスなど) に関する情報を格納します。後のパス (つまり、“ディファード”) では、各ピクセルは順にシェーディングされます。レンダリング時間は主に各ピクセルに影響を与えるライトの数に依存します。透明なオブジェクトと複雑なシェーダーを持つ特定のオブジェクトは、追加のフォワードレンダリングパスを必要とします。ディファードレンダリングは通常、人工的に照らされたインテリアや屋外と屋内のライティングを組み合わせたプロジェクトなど、多くの動的ライトを含むシーンを扱う場合に適しています。

2018 年 1 月に、スクリプタブルレンダーパイプライン (SRP) を発表しました。これを利用すると、C# スクリプティングを使用してレンダリングループをカスタマイズすることができます。実際、これはゲームエンジンの分野での小さな革命です。ユーザーはついに、C++ のような低レベルのプログラミング言語を使用せずに、オブジェクトのカリング、描画、フレームのポストプロセスをパーソナライズすることができるようになりました。

Unity は現在 2 つの構築済み SRP を提供しています。

  • HD レンダーパイプライン (HDRP) は、ハイブリッドのディファード/フォワードで、タイル/クラスターのレンダラーです。高度なレンダリングとシェーディング機能を提供し、高度な視覚的忠実性が求められる PC やコンソールのプロジェクト向けに設計されています。

タイルはフレームの小さな 2 次元の正方形のピクセル範囲であり、クラスターはカメラの錐台内部の 3 次元ボリュームです。タイルとクラスターのレンダリング技術は両方とも、個々のタイルとクラスターに影響を与えるすべてのライトのリストに依存しています。タイルやクラスターのライティングは、それから、既知のライトの対応リストを使って 1 回のパスで計算されます。不透明なオブジェクトはタイルシステムを使用してシェーディングされることが最も一般的ですが、透明なオブジェクトはクラスターシステムを利用します。このレンダラーが提供する主な利点は、ビルトインレンダリングパイプライン (ディファード) と比較して、ライティングの処理が高速で、帯域幅消費が大幅に削減されることです。ビルトインレンダーパイプラインは、ずっと時間のかかるマルチパスのライト集積を利用しています。

  • ユニバーサルレンダーパイプライン (URP) は高速なシングルパスフォワードレンダラーです。これは主に、古いスマートフォン、タブレット、XR デバイスなど、 コンピュートシェーダーテクノロジーをサポートしないローエンドデバイス向けに設計されています。ただし、URP は、コンソールや PC などのミドルレンジデバイス向けにより高い品質のグラフィックスを提供することもできます。その場合、ビルトインレンダーパイプラインよりもパフォーマンスコストが低くなる場合があります。ライトはオブジェクトごとにカリングされ、1 回のパスでライティングを計算できるため、ビルトインレンダーパイプラインに比べてドローコールが削減されます。最後に、URP は 2D レンダラーも提供しており、ディファードレンダラーも計画されています。

下のフローチャートを使用すると、いくつかの重要な基準に基づいてどのレンダリングパイプラインを選択すべきかがすぐにわかります。

設定

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) は以下の通りです。

  1. Realtime Global Illumination: このシステムは、サードパーティのライティングミドルウェアである Enlighten に完全に依存しています。Unity の事前計算の間、Enlighten は他の処理もありますが、クラスタリングとライトトランスポートの 2 つの重い処理を行います。1 つ目は、シーンをクラスターと呼ばれるサーフェスパッチの集合に単純化することであり、2 つ目は、これらのクラスター間の可視性を計算することです。この事前計算されたデータは、インタラクティブに間接ライトを生成するためにランタイムに使用されます。Enlighten の強みはライトをリアルタイムで編集する能力に依存します。事前計算されるデータはクラスター間の関係に依存するためです。ただし、他の従来のライトマップ技法と同様に、シーンの静的ジオメトリを編集すると新しい事前計算が発生します。Enlighten は Unity から廃止されていく予定であり、新しいソリューションが研究されています。
    • HDRP は Unity 2019.3 以降の新しいプロジェクトでは Realtime Global Illumination (リアルタイムグローバルイルミネーション) をサポートしません。それでも、Unity 2019.3 より前に作成されたプロジェクトは 2019.3 または 2019 LTS にアップグレードできます。
    • URP は Enlighten を使用した Realtime Global Illumination をサポートしません。
    • ビルトインレンダーパイプラインは、Unity 2020 LTS (2020年末または2021年初頭)までは Enlighten を使用したリアルタイムグローバルイルミネーションをサポートします。つまり、このバージョンの重大なバグ修正は 2022 年の終わりか 2023 年の始めまで継続されます。

つまり、Unity 2019.3 以降で新しいプロジェクトを開始する場合、URP または HDRP を使用すると Enlighten は使用できません。ビルトインレンダーパイプラインを選択すると、Enlighten は2020 年末/2021 年初頭まで使用できます。

  1. Baked Global Illumination (ベイクした GI): ライトは、ライトマップと呼ばれるテクスチャとライトプローブにベイクされます。ベイクされた GI システムは、以下のライトマッパーの 1 つを使用します。  
    1. プログレッシブライトマッパー
    2. Enlighten

プログレッシブライトマッパーは、シーン全体のすべてのベイク時間を増加させる代わりに、カメラから見えるオブジェクトのライティング計算を優先し、ライティングのイテレーションを大幅に高速化します。プログレッシブライトマッパーは CPU を使用してパストレースで間接光を計算します。新しい GPU プログレッシブライトマッパー は現在開発中で、シーンのベイク時間を著しく短縮します。

Enlighten とプログレッシブライトマッパーはどちらもベイクしたライトを作成するために異なる方法を使用しているため、結果のライトを比較すると正確に同じとは限りません。

下の図を見て、どのような GI システムがプロジェクトに適しているか、またその主な長所と短所を判断してください。

静的 vs 動的

どのような GI システムを使用する場合でも、ライティングのベイク/事前計算の際に、 “Contribute GI” とマーク付けされたオブジェクトのみが考慮されます。動的な (つまり静的でない) オブジェクトは、間接光を受けるためにシーン全体に配置したライトプローブに依存します。

ライトのベイク/事前計算は比較的遅いプロセスなので、凹面やセルフシャドウなど、明確なライティングの変化を伴う大規模で複雑なアセットのみを “Contribute GI” としてマーク付けすべきです。均一なライティングを受ける小さい凸状のメッシュは “Contribute GI” として扱うべきではありません。したがって、よりシンプルなライトの近似を格納する ライトプローブ から間接光を受ける必要があります。大きい動的オブジェクトは、より局部化された間接光を受けるために LPPV を使用することができます。シーン内で “Contribute GI” とマーク付けするオブジェクト数を制限することは、適切なライト品質を維持しながらベイク時間を最短にするためにとても重要です。最適化のプロセスとプローブライティングの重要性については チュートリアル を参照してください。

注意

Unity ではベイクされた GI システムとリアルタイム GI システムの両方を同時にアクティブにすることができ、これによりすべてのライティング機能にアクセス可能です。ただし、両方のシステムを有効にすると、同じデータセットに依存しないため、ランタイム時のベイク時間とメモリ使用量が大幅に増加することに注意する必要があります。さらに、ランタイムに間接光をインタラクティブに更新すると、CPU に負担がかかります。また、ベイクとリアルタイム GI システムが作成する間接光を視覚的に比較すると、両システムは間接光をシミュレートするのに異なるテクニックを使用し、しばしば著しく異なる解像度で操作することがあるため、矛盾が生じる場合があります。

両方の GI システムを使用することは、ハイエンドプラットフォームや、コストが予測可能でシーンを厳密に制御できるプロジェクトに制限する必要があります。このアプローチは、両方のシステムの管理は著しく複雑さを増すため、すべてのライティング設定を深く理解している熟練ユーザーのみに適しています。結果的に、2 つの GI システムのうちの 1 つを使用することが、通常、ほとんどのプロジェクトにとってより安全な方法と言えます。両方のシステムを使用することは、ほとんどの場合、推奨されません。

ライトモード

Light コンポーネントの Mode プロパティは、混乱しやすい共通のソースです。

Light インスペクター には 3 つの ライトモードが あります。

  1. Baked: ライトからの直接光と間接光をライトマップにベイクします。これは時間のかかる処理です。これらのライトを処理するためのランタイムのコストはありませんが、シーンに結果のライトマップを適用するのにわずかなコストがかかります。
  2. Realtime: ライトからの直接光とシャドウはリアルタイムなので、ライトマップにベイクされません。ランタイムコストは、シーンの複雑さ、投影するライトの数、重なるライトの数などによって高くなる可能性があります。さらに、リアルタイム GI を有効にすると、ランタイムに間接光を更新するためにさらにパフォーマンスのコストが発生します。
  3. Mixed: ベイクした間接ライティングやリアルタイムの直接ライティングなど、ベイクとリアルタイムの特徴を組み合わせたハイブリッドモードです。シーンのすべての混合ライトの動作とパフォーマンスへの影響は、そのシーンの Lighting Mode によって異なります。

ライトのモードは Baked Global Illumination システムが有効になっている場合にのみ関係することに注意してください。GI システムを使用しない場合、またはリアルタイム GI システムのみを使用する場合、すべてのベイクされたライトと混合ライトは、Mode プロパティが Realtime に設定されているかのように動作します。

以下の図は、フローチャートと比較表を組み合わせたものです。新しいライトがシーンに追加されるたびに適切なライトモードを決定するのに役立ちます。

ライティングモード

上の図からわかるように、シーンのすべての Mixed (混合) ライトには、Lighting ウィンドウで選択したライティングモードに応じて、特定のベイク機能とリアルタイム機能があります。

3 つのモードから選択できます。

  1. Subtractive
  2. Baked Indirect
  3. Shadowmask

Shadowmask ライティングモードには 2 つの品質設定があります。

  1. Shadowmask
  2. Distance Shadowmask

HDRP の シャドウマスクライティングモード を使用する場合、シャドウマスク機能は Graphics 設定で割り当てられた HDRP アセットで有効です。次に、Frame Settings を使用してカメラに対して有効にする必要があります。

レンダリングパイプライン比較表

以下の表は、Unity 2019.3 の各レンダーパイプラインがサポートする機能の概要です。

ライティングシナリオ

レンダリングパイプラインと主なライティング機能を説明したので、いくつかのプロジェクトの例で、どの設定をライトに使用するかを見てみましょう。すべてのプロジェクトはそれぞれ独特であるため、要件に応じて若干異なるオプションを使用する場合があります。

1. プロトタイプまたは素早い事前可視化

プロトタイプの作成に頻繁にAsset Store を使用している場合は、ストアにあるほとんどのアセットが HDRP と URP と完全に互換性があるわけではないため、ビルトインレンダーパイプラインのみが適切なレンダリングパイプラインになります。それでも、アセットの互換性は時間の経過とともに向上します。すべてのアセットを基礎から構築していて、すでにそのプロジェクトの要件を明確に理解している場合は、2 つの SRP (URP か HDRP) のうち 1 つを選択するか、カスタムのものを作成します。

(事前) 制作の初期段階にあり、ライティングに迅速な転換や最大級の柔軟性が必要な場合は、事前計算を必要としない完全なリアルタイムの方法を好むかもしれません。そのため、ベイクされた GI とリアルタイム GI の両方をオフにします。適切な間接光の不足を緩和するためには、Screen Space Ambient Occlusion を有効にします。これは、コストが低いリアルタイムのコンタクトシャドウを提供することで、シーン内のオブジェクトの接地感を出すのに役立ちます 。

2. 3D モバイル戦略ゲーム

モバイルデバイスをターゲットにしている場合、URP は戦略ゲームの安定したパフォーマンスを確保するための大きな助けになります。ゲームに合わせてレンダリングパイプラインをカスタマイズする必要がある場合は、グラフィックスプログラマーは URP をすぐに拡張するでしょう。URP を選択し、Baked GI を使用する場合は、現在、Shadowmask Mixed Lighting Mode はサポートされていないことに注意してください。

また、Asset Stoere から多くのアセットを使用するなど、古いビルトインレンダリングパイプラインを引き続き使用する場合は、すべてのグローバルの Mixed ライティングモードがサポートされます。この場合、Shadowmask ライティングモードを使用するとベイクしたシャドウが提供され、動的オブジェクトがリアルタイムのシャドウを投影することが可能です。プロジェクトでシャドウマスクのコストが高すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。

3. 優良画質の迷路のシューティングゲーム (1 日の固定された時刻)

リニアの 1 人称シューティングゲームで PC やコンソール用に優良画質のビジュアルを目指す場合は、HDRP が望ましいレンダリングパイプラインと言えます。また、グラフィックスプログラマーの助けを借りて、カスタムの SRP を開発することもできます。

レベルに多くのリアルタイムのシャドウを投影するライト (例えば、破壊可能なライトの小道具や動くライト) がある場合、Baked GI システムを Baked Indirect モードで使用すると、静的ライトプロパティの混合ディレクショナルライトとベイクしたライトからの間接光がきれいに見えるようになります。レベルに高い割合で固定された投影ライトのプロパティが含まれる場合は、シャドウマスクを使用する方法がお勧めです。なぜなら、HDRP は素晴らしいハイブリッドの Shadowmask モードを提供して、リアルタイムシャドウとベイクシャドウのブレンドをより細かく制御できるからです。

Nintendo Switch もサポートする場合は、URP を使用することをお勧めします。これにより、市場に出回っているほとんどのゲームプラットフォームをサポートすることができ、プロジェクトを HDRP から URP に、またはその逆に変換するという面倒な処理を行う必要がありません。

4. バトルロイヤル (昼夜のサイクル)

PC やコンソール用に大規模な環境と完全に動的なライティングを特徴とするバトルロイヤルゲームをリリースする場合は、HDRP を選択するか、プロジェクトにレンダリングパイプラインを合わせるために HDRP を拡張する必要があります。質の高い視覚的忠実度を目指すのではなく、モバイルデバイスや低仕様のシステムをターゲットにしている場合は、URP を検討することもできます。

HDRP と URP はリアルタイム GI システム (Enlighten) をサポートしていません。そのため、昼夜のサイクルに対応するために Indirect Bake と、例えば、1 日を通して太陽と間接光を調節するようなカスタム性のスクリプトを使って処理する必要があります。

この特定のシナリオでは、Realtime GI とBaked GIシステムの両方をアクティブにすることはお勧めできません。なぜなら、パフォーマンスとシーン管理に重大なレベルの多大なオーバーヘッドが発生するからです。GI システムを両方使用することに対するもうひとつの議論は、このような大規模なマルチプレイヤーゲームの予測不可能な性質です。例えば、パフォーマンスの見積もりは、スクリプティングを多く使用したシングルプレイヤーの冒険よりもさらに困難です。

最後に

スクリプタブルレンダーパイプラインが導入されたことで、Unity のレンダリング環境は著しく変化しました。したがって、ライティングパイプラインのためのこれらのすべての変更とそれらの影響に追いつくことは、大変な作業です。

このガイドと多くの図が各レンダリングパイプライン の機能をよりよく理解する助けとなり、みなさんが Unity のプロジェクトを確実に適切な設定で自信をもってライティングできるよう願っています。

Unity のライティングとレンダリングパイプラインの詳細については、以下の記事を参照してください。

Believable visuals: dynamic lighting
物理演算