見出し画像

Unity URP のカメラ

以下の記事を参考にして書いてます。

Cameras

1. URPのカメラ

Unityのカメラは、現実の世界のカメラと同じように機能します。3次元空間でオブジェクトのビューをキャプチャし、そのビューをフラット化して2次元の画面に表示します。

「URP」(Universal Render Pipeline)のカメラは、Unityの標準のカメラ機能に基づいていますが、いくつかの大きな違いがあります。

・Universal Additional Camera Dataコンポーネント : カメラコンポーネントの機能を拡張し、URPが追加のカメラ関連データを保存できるようにします。
・ Render Type : URPのカメラの2つのタイプ「Base」「Overlay」を指定します。
・カメラスタッキングシステム : 複数のカメラの出力を単一の結合出力にレイヤー化できます。
・ボリュームシステム : シーン内の特定のトランスフォームの位置に基づいて、後処理効果をカメラに適用できます。
・Cameraコンポーネント : URP固有のプロパティを持ちます。

2. Universal Additional Camera Dataコンポーネント

「Universal Additional Camera Dataコンポーネント」は、「URP」が内部データストレージに使用するコンポーネントです。「Universal Additional Camera Dataコンポーネント」を使用すると、「URP」はUnityの標準カメラコンポーネントの機能と外観を拡張およびオーバーライドできます。

「URP」では、Cameraコンポーネントを持つゲームオブジェクトには、「Universal Additional Camera Dataコンポーネント」も必要です。プロジェクトで「URP」を使用している場合、Cameraゲームオブジェクトを作成すると、Unityによって「Universal Additional Camera Dataコンポーネント」が自動的に追加されます。

スクリプトを使用して「URP」を制御およびカスタマイズしない場合は、「Universal Additiona Camera Dataコンポーネント」を使用して何もする必要はありません。スクリプトを使用して「URP」を制御およびカスタマイズする場合は、次のようなスクリプトでカメラの「Universal Additional Camera Dataコンポーネント」にアクセスできます。

var cameraData = camera.GetUniversalAdditionalCameraData();

詳細については、「UniversalAdditionalCameraData APIのドキュメント」を参照してください。

3. Base Camera

「Base Camera」は、「URP」のデフォルトのカメラ種別です。「Base Camera」は、特定のレンダーターゲットにレンダーする汎用カメラです。

「URP」で何かをレンダリングするには、シーンに少なくとも1つの「Base Camera」が必要です。シーンには複数の「Base Camera」を含めることができます。「Base Camera」を単独で使用することも、カメラスタックで使用することもできます。

シーンにアクティブな「Base Camera」がある場合、以下のアイコンがシーンビューのカメラギズモの横に表示されます。

画像1

「Base Camera」のプロパティについては、「Base Cameraコンポーネントリファレンス」を参照してください。

4. Overlay Camera

「Overlay Camera」は、ビューを別のカメラの出力の上にレンダリングするカメラです。「Overlay Camera」を使用して、2D UIの3Dオブジェクトや、車両のコックピットなどのエフェクトを作成できます。

「カメラスタッキングシステム」を使用して、「Overlay Camera」を1つ以上の「Base Camera」と組み合わせて使用する必要があります。「Overlay Camera」を単独で使用することはできません。カメラスタックの一部ではない「Overlay Camera」は、レンダーループのステップを実行しません。

【注意】現在のバージョンのURPの「Overlay Camera」と「カメラスタッキング」は、「フォワードレンダラー」を使用する場合にのみサポートされます。

シーンにアクティブな「Overlay Camera」がある場合、以下のアイコンがシーンビューのカメラギズモの横に表示されます。

画像2

カメラスタックの基本カメラは、カメラスタックのほとんどのプロパティを決定します。カメラスタックでは「Overlay Camera」しか使用できないため、「URP」はシーンのレンダリング時に「Overlay Camera」の次のプロパティのみを使用します。

・Projection
・FOV Axis
・Field of View
・Physical Camera properties
・Clipping plans
・Renderer
・Clear Depth
・Opaque Texture
・Depth Texture
・Render Shadows
・Culling Mask
・Occlusion Culling

Unityはインスペクタで他のすべての未使用のプロパティを非表示にします。
スクリプトを使用して未使用のプロパティにアクセスできますが、これらの未使用のプロパティを変更しても、「Overlay Camera」を使用する「カメラスタック」の視覚的な出力には影響しません。

個々の「Overlay Camera」に後処理を適用することはできません。個別の「Base Camera」または「カメラスタック」に後処理を適用できます。

「Overlay Camera」のプロパティについては、「Overlay Cameraコンポーネントリファレンス」を参照してください。

5. 複数のカメラでの作業

「URP」では、複数のカメラを使用して、次のことが可能です。

・カメラスタッキング
複数のカメラの出力を単一の結合出力にレイヤー化します。カメラスタッキングを使用すると、2D UIの3Dモデルや車両のコックピットなどのエフェクトを作成できます。

・複数の「Base Camera」またはカメラスタッキングを同じレンダーターゲットに描画
これにより、分割画面レンダリングなどの効果を作成できます。

・「Base Camera」またはカメラスタッキングをレンダーテクスチャに描画
レンダーテクスチャに描画すると、CCTVモニターなどのエフェクトを作成できます。

これらの方法を組み合わせて、より複雑なエフェクトを作成できます。たとえば、2つの「カメラスタック」を定義し、それぞれを同じレンダリングターゲットの異なる領域にレンダリングする「カメラスタック」を設定できます。

6. カメラスタッキング

「URP」では、「カメラスタッキング」を使用して複数のカメラの出力をレイヤー化し、単一の結合出力を作成できます。「カメラスタッキング」を使用すると、2D UIの3Dモデルや車両のコックピットなどのエフェクトを作成できます。

「カメラスタック」は、「Base Camera」と1つ以上の「Oberlay Camera」で構成されます。「カメラスタック」は、「Base Camera」の出力を、「カメラスタック」内のすべてのカメラの合計出力で上書きします。したがって、「Base Camera」の出力で実行できることは何でも、「カメラスタック」の出力で実行できます。たとえば、特定のレンダーターゲットに「カメラスタック」を描画したり、「ポストプロセスエフェクト」を適用したりできます。

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

◎ カメラスタックへのカメラの追加
「Base Camera」を選択し、インスペクタの「Stack」で「+」をクリックし、「Overlay Camera」を追加します。

画像3

「Overlay Camera」は、「Base Camera」の「カメラスタック」の一部になります。Unityは、「Base Camera」の出力の上に「Overlay Camera」の出力を描画します。

次のように、「Base Camera」の「Universal Additional Camera Dataコンポーネント」のcameraStackを直接操作することで、スクリプトで「Overlay Camera」を「カメラスタック」に追加することもできます。

var cameraData = camera.GetUniversalAdditionalCameraData();
cameraData.cameraStack.Add(myOverlayCamera);

◎ カメラスタックからのカメラの削除
「Base Camera」を選択し、インスペクタの「Stack」で「Overlay Camera」を選択し、「ー」をクリックします。

「Overlay Camera」はシーンに残りますが、「カメラスタック」の一部ではなくなります。

次のように、「Base Camera」の「Universal Additional Camera Dataコンポーネント」のcameraStackを直接操作することにより、スクリプトで「Overlay Camera」を「カメラスタック」から削除することもできます。

var cameraData = camera.GetUniversalAdditionalCameraData();
cameraData.cameraStack.Remove(myOverlayCamera);

◎ カメラスタック内のカメラの順序の変更
「Base Camera」を選択し、インスペクタの「Stack」で「Overlay Camera」の横にあるハンドルを使用して、並べ替えます。

「Base Camera」は「カメラスタック」のベースレイヤーを描画し、スタック内の「Overlay Camera」はこの上に、リストされている順序で上から下に描画します。

「Base Camera」の「Universal Additional Camera Dataコンポーネント」のcameraStackを直接操作することで、スクリプトで「カメラスタック」を並べ替えることができます。

7. 複数のカメラから同じレンダリングターゲットへの描画

「URP」では、複数の「Base Camera」または「カメラスタック」を同じレンダーターゲットに描画できます。これにより、分割画面レンダリングなどの効果を作成できます。

複数の「Base Camera」または「カメラスタック」がレンダーターゲットの同じ領域に描画する場合、Unityは重複する領域の各ピクセルを複数回描画します。Unityは、最後に優先度が最も高い「Base Camera」または「カメラスタック」を、以前に描画されたピクセルの上に描画します。

「Base Camera」の出力ターゲットプロパティを使用してレンダーターゲットを定義し、ビューポートレクプロパティを使用してレンダーターゲットの領域を定義してレンダリングします。

◎ 分割画面レンダリングのセットアップ
(1) シーンにCameraを作成。
Render ModeはデフォルトでBaseになります。
(2) Cameraを選択。
インスペクタの「Output→ Viewport Rect」を以下の用に変更します。

画像4

(3) シーンに別のCameraを作成。
Render ModeはデフォルトでBaseになります。
(4) Cameraを選択。
インスペクタの「Output → Viewport Rect」を以下の用に変更します。

画像5

Unityは、最初のカメラを画面の左側に、2番目のカメラを画面の右側に描画します。

次のように、rectプロパティを設定することで、スクリプト内のカメラのビューポートの四角形を変更できます。

myUniversalAdditionalCameraData.rect = new Rect(0.5f, 0f, 0.5f, 0f);

8. レンダーテクスチャへの描画

「URP」では、カメラは画面またはレンダーテクスチャに描画できます。画面への描画がデフォルトであり、最も一般的な使用例ですが、レンダーテクスチャへの描画により、CCTVカメラモニターなどのエフェクトを作成できます。

レンダーテクスチャに描画するカメラがある場合は、そのレンダーテクスチャを画面に描画する2番目のカメラが必要です。「URP」では、レンダリングテクスチャに描画するすべてのカメラが、画面に描画するすべてのカメラの前にレンダリングループを実行します。これにより、レンダーテクスチャが画面に描画できるようになります。

◎ レンダリングテクスチャに描画してから、そのレンダリングテクスチャを画面に描画

画像6

(1) 「Assets → Create → Render Texture」を使用して、プロジェクトに 「Render Texture」アセットを作成。
(2) シーンにQuadを作成。
(3) プロジェクトにMaterialを作成して選択。
(4) インスペクタで、レンダリングテクスチャをMaterialのBase Mapフィールドにドラッグ。
(5) シーンビューでMaterialをQuadにドラッグ。
(6) シーンにCameraを作成。
Render ModeはデフォルトでBaseになります。
(7) Base Cameraを選択。
(8) インスペクタで、OutputにOutput Textureにレンダーテクスチャをドラッグ。
(9) シーンに別のカメラを作成。
Render ModeはデフォルトでBaseになります。
(10) 新しいBase Cameraのビュー内にQuadを配置。

最初のカメラは、そのビューをレンダーテクスチャに描画します。2番目のカメラは、レンダリングテクスチャを含むシーンを画面に描画します。

次のように、カメラの「Universal Additional Camera Dataコンポーネント」のcameraOutputを設定することにより、スクリプトでカメラの出力ターゲットを設定できます。

myUniversalAdditionalCameraData.cameraOutput = CameraOutput.Texture;
myCamera.targetTexture = myRenderTexture;

9. Base Cameraのクリア

◎ Color Buffer
レンダーループの開始時に、「Base Camera」は、カラーバッファをスカイボックスにクリアするか、カラーバッファをソリッドカラーにクリアするか、初期化されていないカラーバッファを使用できます。この動作は、「Base Camera」の「Background Type」で選択できます。

初期化されていないカラーバッファの内容はプラットフォームによって異なることに注意してください。一部のプラットフォームでは、統一されたカラーバッファに前のフレームのデータが含まれます。他のプラットフォームでは、統一されたカラーバッファには初期化されていないメモリが含まれます。カメラがカラーバッファ内のすべてのピクセルに描画し、不必要なクリア操作のコストを発生させたくない場合にのみ、統一されたカラーバッファの使用を選択する必要があります。

◎ Depth Buffer
「Base Camera」は、各レンダーループの開始時に常に深度バッファをクリアします。

10.  Overlay Cameraのクリア

◎ Color Buffer
レンダーループの開始時に、「Overlay Camera」は「カメラスタック」内の前のカメラからのカラーデータを含むカラーバッファを受け取ります。カラーバッファの内容はクリアされません。

◎ Depth Buffer
レンダーループの開始時に、「Overlay Camera」は、「カメラスタック」内の前のカメラからの深度データを含む深度バッファを受け取ります。この動作は、「Overlay Camera」の「Clear Depth」を使用して選択できます。

「Clear Depth」がtrueに設定されている場合、「Overlay Camera」は深度バッファをクリアし、そのビューを既存のカラーデータの上にあるカラーバッファに描画します。「Clear Depth」がfalseに設定されている場合、「Overlay Camera」はビューをカラーバッファに描画する前に深度バッファをテストします。

11. カメラのカリングとレンダリングの順序

「URP」のシーンに複数のカメラが含まれている場合、Unityはカリングおよびレンダリング操作を予測可能な順序で実行します。

Unityはフレーム毎に次の操作を実行します。

(1) シーン内のすべてのアクティブな「Base Camera」のリストを取得。
(2) アクティブな「Base Camera」を2つのグループに分ける。
ビューをレンダーテクスチャに描画するカメラと、ビューを画面に描画するカメラです。
(3) レンダーテクスチャを描画する「Base Camera」を優先順位順に並べ替える。
これにより、優先順位の値が高いカメラが最後に描画されます。
(4) レンダーテクスチャに描画する「Base Camera」ごとに、Unityは次の手順を実行。
 (4-1) 「Base Camera」をカリング。
 (4-2) 「Base Camera」をレンダーテクスチャ描画。
 (4-3) 「Base Camera」のカメラスタックの一部である「Overlay Camera」ごとに、カメラスタックで定義された順序で、次の操作を実行。
  (4-3-1) 「Overlay Camera」をカリング。
  (4-3-2) オーバーレイカメラをレンダーテクスチャに描画。
(5) 画面にレンダリングされる「Base Camera」を優先順位順に並べ替え、優先順位の値が高いカメラが最後に描画されるようにする。
(6) 画面にレンダリングする「Base Camera」ごとに、Unityは次の手順を実行。
 (6-1) 「Base Camera」をカリング。
 (6-2) 「Base Camera」を画面に描画。
 (6-3) 「Base Camera」のカメラスタックの一部である「Overlay Camera」ごとに、カメラスタックで定義された順序で、次の操作を実行。
  (6-3-1) 「Overlay Camera」をカリング。
  (6-3-2) 「Overlay Camera」を画面に描画。

Unityは、フレーム中に「Overlay Camera」のビューを複数回描画できます。これは、「Overlay Camera」が複数のカメラスタックに表示されるか、「Overlay Camera」が同じカメラスタックに複数回表示されるためです。 この場合、Unityはカリングまたはレンダリング操作の要素を再利用しません。上記の詳細な順序で、操作が完全に繰り返されます。

【注意】このバージョンの「URP」では、「Overlay Camera」とカメラスタッキングは、フォワードレンダラーを使用する場合にのみサポートされます。 2Dレンダラーを使用している場合、「Overlay Camera」はレンダリングループの一部を実行しません。

12. オーバードロー

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

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

13. Cameraコンポーネント

「Cameraコンポーネント」の詳細については、「Cameraコンポーネントリファレンス」を参照してください。


この記事が気に入ったらサポートをしてみませんか?