消去、レンダリング順序、オーバードロー
消去
Universal Render Pipeline (ユニバーサルレンダーパイプライン、URP) では、カメラの消去動作はカメラの Render Type によって異なります。
ベースカメラ
カラーバッファ
レンダーループの開始時に、ベースカメラ はカラーバッファを消去してスカイボックスにするか、カラーバッファを消去してソリッドカラーにするか、初期化されていないカラーバッファを使用することができます。この動作は、ベースカメラの Inspector の Background Type プロパティを使用して選択できます。
初期化されていないカラーバッファの内容は、プラットフォームによって異なることに注意してください。初期化されていないカラーバッファに、前のフレームのデータが含まれるプラットフォームもあれば、初期化されていないメモリが含まれるプラットフォームもあります。初期化されていないカラーバッファは、カメラがカラーバッファのすべてのピクセルに描画し、不要な消去処理のコストを発生させたくない場合にのみ使用してください。
深度バッファ
ベースカメラは、各レンダーループの開始時に、常に深度バッファを消去します。
オーバーレイカメラ
カラーバッファ
レンダーループの開始時に、オーバーレイカメラ は、カメラスタック内の前のカメラの色データを含むカラーバッファを受け取ります。カラーバッファの内容は消去されません。
深度バッファ
レンダーループの開始時に、オーバーレイカメラは、カメラスタック内の前のカメラの深度データを含む深度バッファを受け取ります。この動作は、オーバーレイカメラの Inspector の Clear Depth プロパティを使用して選択できます。
Clear Depth を true に設定すると、オーバーレイカメラは深度バッファを消去し、既存の色データに重ねてカラーバッファにビューを描画します。Clear Depth を false に設定すると、オーバーレイカメラはカラーバッファにビューを描画する前に深度バッファに対してテストを実行します。
カメラカリングとレンダリング順序
URP のシーンに複数のカメラが含まれている場合、Unity は予測可能な順序でカリングおよびレンダリング処理を実行します。
1 フレームに 1 回、以下の処理を実行します。
- シーン内のすべてのアクティブな ベースカメラ のリストを取得します。
- アクティブなベースカメラを、レンダーテクスチャにビューをレンダリングするカメラと、画面にビューをレンダリングするカメラの 2 つのグループに整理します。
- レンダーテクスチャにレンダリングするベースカメラを Priority の順にソートし、Priority の値が高いカメラが最後に描画されるようにします。
- レンダーテクスチャにレンダリングする各ベースカメラについて、以下のステップを実行します。
- 画面にレンダリングするベースカメラを Priority の順にソートし、Priority の値が高いカメラが最後に描画されるようにします。
- 画面にレンダリングする各ベースカメラについて、Unity は以下のステップを実行します。
- ベースカメラをカリングする
- ベースカメラを画面にレンダリングする
- ベースカメラのカメラスタックに含まれている各オーバーレイカメラについて、カメラスタックで定義された順序で、以下のステップを実行します。
- オーバーレイカメラをカリングする
- オーバーレイカメラを画面にレンダリングする
オーバーレイカメラが複数のカメラスタックで表示される場合、またはオーバーレイカメラが同じカメラスタックで複数回表示される場合、1 フレーム中にオーバーレイカメラのビューを複数回レンダリングすることがあります。この場合、カリング処理とレンダリング処理のいかなる要素も再利用しません。すべての処理を前述の順序で繰り返します。
重要な注意事項: このバージョンの URP では、オーバーレイカメラと Camera Stacking は、ユニバーサルレンダラーを使用している場合にのみサポートされます。オーバーレイカメラは、2D Renderer を使用している場合、レンダリングループのどの部分も実行しません。
オーバードロー
URP は、レンダリング順序の最適化など、カメラ内でいくつかの最適化を実行して、オーバードローを減らします。しかし、カメラスタックを使用する場合、ユーザーがそれらのカメラのレンダリング順序を効果的に定義することになります。したがって、過度なオーバードローが生じるような形でカメラの順序を設定しないように注意する必要があります。
カメラスタック内の複数のカメラが同じレンダーターゲットにレンダリングする場合、Unity はカメラスタック内の各カメラのレンダーターゲットの各ピクセルを描画します。さらに、複数のベースカメラまたはカメラスタックが同じレンダーターゲットの同じ領域にレンダリングする場合、各ベースカメラまたはカメラスタックが必要とする回数だけ、重なっている領域内のピクセルを再び描画します。
Unity の フレームデバッガー や、プラットフォーム固有のフレームキャプチャとデバッグツールを使用すると、シーンのどこで過度なオーバードローが発生しているかを把握できます。その結果をもとに、カメラスタックを最適化することができます。