UniversalRenderPipelineでも複数カメラを使えるようになってた

参考元

2020年2月10日-2019.3以上? URPのバージョンが7.2.0から。

待ってた……。

URP良さそうだなと思ってたんですけど、複数のカメラが使えなかったんで長らく敬遠してました。

しかし、2020年2月10日のUpdateでURPのバージョンが7.2.0になり、CameraStackの機能が追加されて、Defaultのレンダーパイプラインと同じように複数のカメラを使ってHUDみたいなUIを表現することが可能になりました。

使ってみます。

まず、PackageManagerからURP7.2以降にUpdate。対応するUnityのバージョンは2019.3以降とかかも。

次にベースのカメラとUI用のカメラを作成します。

UI用のカメラのみ、インスペクタ―から、「RenderType」を「OverRay」に変更します。

ベースになるカメラの「Stack」プロパティにGUICameraを設定します。

UIをベースのカメラに被せることが出来ました。


注意事項

LostCryptで使われてる2DRendererでは使えないとか。

Important note: In this version of URP, Overlay Cameras and Camera Stacking are supported only when using the Forward Renderer. Overlay Cameras will not perform any part of their rendering loop if using the 2D Renderer.

Google翻訳:

重要な注意:このバージョンのURPでは、オーバーレイカメラとカメラスタッキングは、フォワードレンダラーを使用する場合にのみサポートされます。 2Dレンダラーを使用している場合、オーバーレイカメラはレンダリングループのどの部分も実行しません。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/cameras-advanced.html

あとこんな留意点も。SRP(デフォルトのレンダーパイプライン)の場合と同じことに気を付ければ良いのかな……。よくわかんないっす。

Overdraw
URP performs several optimizations within a Camera, including rendering order optimizations to reduce overdraw. However, when you use a Camera Stack, you effectively define the order in which those Cameras are rendered. You must therefore be careful not to order the Cameras in a way that causes excessive overdraw.

When multiple Cameras in a Camera Stack render to the same render target, Unity draws each pixel in the render target for each Camera in the Camera Stack. Additionally, if more than one Base Camera or Camera Stack renders to the same area of the same render target, Unity draws any pixels in the overlapping area again, as many times as required by each Base Camera or Camera Stack.

google翻訳:

オーバードロー

URPは、オーバードローを減らすためのレンダリング順序の最適化など、カメラ内でいくつかの最適化を実行します。ただし、カメラスタックを使用する場合、これらのカメラがレンダリングされる順序を効果的に定義します。したがって、過剰なオーバードローを引き起こすような方法でカメラを注文しないように注意する必要があります。

カメラスタック内の複数のカメラが同じレンダーターゲットにレンダーすると、Unityはカメラスタック内の各カメラのレンダーターゲット内の各ピクセルを描画します。さらに、複数のベースカメラまたはカメラスタックが同じレンダーターゲットの同じ領域にレンダーする場合、Unityは各ベースカメラまたはカメラスタックが必要とする回数だけ、重複領域にピクセルを再描画します。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/cameras-advanced.html

カメラのCullingMaskを設定してUI用のカメラはUI用のCanvasとかしか描画しないようにしましょうとかそういう事かな……。

奥にあるものは描画しないとか、半透明だと描画する順番があるとか、Cullingとかそういうことを言ってるのかも。