2D ライティングシステムの概要
URP に含まれている 2D ライティングシステムは、使いやすいアーティスト向けツールとランタイムコンポーネントのセットで構成されており、スプライトレンダラー などの Unity のコアコンポーネントと、おなじみの 3D ライトコンポーネントの 2D 版である 2D ライトコンポーネントを使用して、ライティングされた 2D シーンをすばやく作成できます。
これらのツールは、スプライトレンダラー、タイルマップレンダラー、スプライトシェイプレンダラー などの 2D レンダラーとシームレスに統合できるように設計されています。このツールとコンポーネントのシステムは、モバイルシステムや、複数のプラットフォームでの実行に最適化されています。
3D ライトとの相違点
2D ライトと 3D ライトの実装と動作には、以下のような重要な違いがいくつかあります。
新しい 2D 固有のコンポーネントとレンダーパス
2D ライティングシステムには、2D ライティングと 2D レンダリング向けに特別に設計された独自の 2D ライトコンポーネント、シェーダーグラフ サブターゲット、カスタム 2D レンダーパスのセットが含まれています。また、2D ライトとパス設定用のエディターツールも含まれています。
同一平面上
2D ライティングモデルは同一平面上にあるマルチレイヤーの 2D 世界で動作するように特別に設計されています。2D ライトでは、ライトとライティングされるオブジェクトの間で深度を分離する必要はありません。2D シャドウシステムも同一平面上で動作し、深度を分離する必要はありません。
非物理演算ベース
2D ライトのライティング計算は、3D ライトのような物理演算ベースの計算ではありません。ライティングモデルの計算の詳細については、以下で説明します。
3D ライトや 3D レンダラーとの相互運用性がない
現在、3D ライトと 2D ライトは、それぞれ 3D レンダラーと 2D レンダラーにのみ影響を与えることができます。2D ライティングは メッシュレンダラー などの 3D レンダラーには作用や影響を与えません。同様に、3D ライティングも スプライトレンダラー などの 2D レンダラーには影響を与えません。将来的には、それぞれのライトとレンダラーの相互運用機能が開発される可能性もありますが、現在でも Camera Stacking という手法により、1 つのシーンで 2D ライトと 3D ライト、2D レンダラーと 3D レンダラーを組み合わせて使用できます。
2D ライティングのグラフィックスパイプラインの技術的詳細
2D ライティングのグラフィックスパイプラインのレンダリングプロセスは、次の 2 つのフェーズに分けることができます。 1) ライトレンダーテクスチャの描画 2) レンダラーの描画
ライトレンダーテクスチャは、スクリーンスペースでのライトの色と形状に関する情報が含まれている レンダーテクスチャ です。
この 2 つのフェーズは、ライティングが他と異なるライトレイヤーのセットに対してのみ繰り返されます。つまり、ソートレイヤー 1 から 4 のライトのセットがまったく同じものである場合、上記の一連の処理は 1 回だけ実行されます。
デフォルトの設定を使用すると、レンダラーを描画する前に複数の バッチ を先に描画し、ターゲットの切り替えを減らすことができます。最適な設定は、パイプラインですべてのバッチのライトレンダーテクスチャをレンダリングしてから、レンダラーの描画に進むことです。これにより、カラーターゲットのロードとアンロードを避けることができます。詳細については、最適化 を参照してください。
準備フェーズ: ソートレイヤーバッチングの計算
レンダリングフェーズに進む前に、2D ライティングのグラフィックスパイプラインは、まずシーンを分析し、どのレイヤーを 1 回の描画処理でバッチ処理できるかを評価します。以下は、レイヤーをバッチ処理するかどうかを判断する基準です。
- 連続したレイヤーである。
- まったく同じライトのセットを共有しているレイヤーである。
ライトレンダーテクスチャの描画処理の回数を最小限に抑え、パフォーマンスを高めるために、できるだけ多くのレイヤーをバッチ処理することを強くお勧めします。
フェーズ 1: ライトレンダーテクスチャの描画
準備フェーズでバッチングを行った後、パイプラインはそのバッチのライトテクスチャを描画します。ここでは基本的にライトの形状をレンダーテクスチャに描画します。ライトの色と形状は、ライトの設定に応じて、加算ブレンドやアルファブレンドを使用してターゲットのライトレンダーテクスチャにブレンドできます。
ライトレンダーテクスチャは、少なくとも 1 つの 2D ライトがターゲットにしている場合にのみ作成されることに留意してください。例えば、レイヤーのすべてのライトが Blendstyle #1 のみを使用している場合、ライトレンダーテクスチャは 1 つだけ作成されます。
フェーズ 2: レンダラーの描画
すべてのライトレンダーテクスチャが描画されると、パイプラインはレンダラーの描画に進みます。システムは、どのライトレンダーテクスチャセットによってどのレンダラーセットが描画されたかを追跡します。これらは、準備フェーズ のバッチングプロセスで関連付けられたものです。
レンダラーの描画中、パイプラインは利用できるすべての (各ブレンドスタイルに 1 つの) ライトレンダーテクスチャにアクセスできます。シェーダーでは、入力色とライトレンダーテクスチャの色を、指定された処理を使用して組み合わせ、最終的な色を計算します。
4 つのアクティブなブレンドスタイルの設定例です。複数のブレンドスタイルがどのように組み合わせられるかを示しています。ほとんどの場合、2 つのブレンドスタイルがあれば、目的の効果が得られます。
最適化
ドローコールの削減、カリング、シェーダーの最適化などの標準的な最適化手法に加え、2D ライティングのグラフィックスパイプライン固有の手法と考慮事項をいくつか紹介します。
ブレンドスタイルの数
レンダリングパフォーマンスを高める最も簡単な方法は、使用するブレンドスタイルの数を減らすことです。各ブレンドスタイルはレンダーテクスチャであり、レンダリングしてからアップロードする必要があります。
ブレンドスタイルの数を減らすと、パフォーマンスに直接的な影響があります。シンプルなシーンであれば、ブレンドスタイルは 1 つで十分です。また、1 つのシーンで使用するブレンドスタイルは 2 つ以下であるのが普通です。
ライトレンダーテクスチャのスケール
2D ライティングシステムは、スクリーンスペースのライトレンダーテクスチャを利用してライトの影響をキャプチャします。そのため、多くのレンダーテクスチャが描画され、その後アップロードされることになります。適切なレンダーテクスチャサイズの選択は、パフォーマンスに直接影響します。
デフォルトでは、サイズは画面解像度の 0.5 倍に設定されています。ライトレンダーテクスチャのサイズを小さくすると、パフォーマンスは向上しますが、ビジュアルアーティファクトが発生します。画面サイズの半分の解像度であれば、多くの場合、アーティファクトはほとんど目立たず、良好なパフォーマンスが得られます。
さまざまなスケールを試し、プロジェクトに適したものを見つけてください。
レイヤーバッチング
ライトレンダーテクスチャの数をさらに減らすには、ソートレイヤーをバッチ処理できるようにすることが重要です。同じライトレンダーテクスチャのセットを使用するレイヤーがバッチ処理されます。ライティングが他と異なるレイヤーは、独自のセットを使用することになるため、必要な処理の量が増加します。
レイヤーは、同じライトのセットを共有している場合、バッチ処理することができます。
ライトレンダーテクスチャの事前レンダリング
複数のライトレンダーテクスチャのセットを、レンダラーを描画する前にレンダリングできます。すべてのライトレンダーテクスチャを事前にレンダリングしてから、最終的な色の出力にレンダラーを描画するのが理想的です。これにより、最終的な色の出力をロード/アンロード/再ロードする必要性が減ります。
設定が非常に複雑で、ライティングが他と異なるレイヤーが数多くある場合は、すべてのライトレンダーテクスチャを事前にレンダリングするのは現実的でないでしょう。この上限は、2D Renderer Data の Inspector で設定できます。
法線マップ
法線マップを使用した深度のシミュレーションは、現時点では、コストが非常に高い処理です。これが有効な場合、デプスプレパスの間にフルサイズのレンダーテクスチャが作成され、レンダラーがその上に描画されます。この処理は、各レイヤーバッチに対して行われます。
奥行き知覚のシミュレーションを行うための法線マッピングエフェクトが不要な場合は、すべてのライトで法線マップオプションを無効にしてください。