Version: 2023.1
言語: 日本語
アクティブなレンダーパイプラインの取得と設定の方法
ビルトインレンダーパイプラインの使用

レンダーパイプラインとライティングソリューションの選択と設定

このガイドは 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 で利用可能なグローバルイルミネーションシステム (Global Illumination systems) は以下の通りです。

  1. リアルタイムグローバルイルミネーション: このシステムは、サードパーティのミドルウェアソリューションである Enlighten をベースにしています。事前計算を行い、ContributeGI 設定を有効にしてシーン内のゲームオブジェクトを変更しない場合は、リアルタイムでライティングを調整できます。

  2. 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.

プログレッシブライトマッパーは、パストレーシングを使用して間接照明の値を計算します。シーン ビューカメラから見えるオブジェクトに影響するライトの事前計算を優先できます。ライトマップの一部のライティングだけを更新すると全体のベイク時間が長くなりますが、より速くライティングデザインを反復することができます。

スクリプタブルレンダーパイプラインに固有の互換性情報については、レンダーパイプライン機能の比較 を参照してください。比較表で指定されていない限り、ビルトインレンダーパイプラインはこの記事で説明するすべての機能をサポートします。

静的 vs 動的

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

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

注意

Unity エディターとプレイヤーでは、Enlighten リアルタイムグローバルイルミネーションとベイクしたライティングの両方を同時に使用することができます。

ただし、これらの機能を同時に有効にすると、同じデータセットを使用しないため、ベイク時間やランタイム時のメモリ使用量が大幅に増加します。ベイクした間接光と Enlighten リアルタイムグローバルイルミネーションで提供される間接光は、ベイクに使用するライトマッパーに関係なく、視覚的な違いがあることが予想されます。これは、Enlighten リアルタイムグローバルイルミネーションが Unity のベイクバックエンドと大きく異なる解像度で動作し、間接光をシミュレートするために異なるテクニックに依存しているためです。

Enlighten リアルタイムグローバルイルミネーションとベイクしたライティングの両方を同時に使用する場合は、ハイエンドなプラットフォームや、予測可能なコストで厳密に制御されたシーンのプロジェクトに限定してください。この方法を効果的に使用できるのは、すべてのライティング設定を熟知している上級のユーザーのみです。したがって、ほとんどのプロジェクトでは、2 つのグローバルイルミネーションシステムのうち 1 つを選択する方が、通常は安全な戦略であると言えます。両方のシステムの使用が推奨されるケースはほとんどありません。

ライトモード

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

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

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

ライトのモードはベイクしたグローバルイルミネーション (GI) システムが有効になっている場合にのみ影響することに注意してください。GI システムを使用しない場合、または Enlighten リアルタイム 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 を使用してカメラに対して有効にする必要があります。

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

スクリプタブルレンダーパイプラインに固有の互換性情報については、レンダーパイプライン機能の比較 を参照してください。比較表で指定されていない限り、ビルトインレンダーパイプラインはこの記事で説明するすべての機能をサポートします。

ライティングシナリオ

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

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

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

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

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

モバイルデバイスをターゲットにする場合、URP はゲームの確かなパフォーマンスを確保するために素晴らしい候補となり得ます。グラフィックスプログラマーの助けを借りれば、多くの場合、ゲーム固有のニーズに合わせて URP をカスタマイズすることが可能です。

ビルトインレンダー パイプラインと URP はどちらもシャドウマスクライティングモードをサポートしており、これにより、動的オブジェクトがリアルタイムシャドウを作るようにしながら、静的オブジェクトのシャドウをベイク処理できるようになります。 シャドウマスクがプロジェクトにとって高負荷すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。

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

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

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

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

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

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

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

最後に

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

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

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

アクティブなレンダーパイプラインの取得と設定の方法
ビルトインレンダーパイプラインの使用