メインコンテンツまでスキップ

複数のカメラ

シーンには任意の数のカメラを配置でき、それらはシンプルなモデルに従って最終的な画像へ合成されます。有効なすべてのカメラは、自身のレイヤーを、自身のレンダーターゲット(レンダーターゲットが設定されていなければ画面)のビューポートに、priority の順(小さい値が先)でレンダリングします。

このモデルは幅広い構成をサポートします。分割画面のマルチプレイヤー、ミニマップやバックミラーのようなピクチャインピクチャのオーバーレイ、3Dシーンの上に描画されるUI、監視モニターやポータルのようなレンダーテクスチャのサーフェスなどです。

Multi Camera

ビューポート

デフォルトでは、カメラはレンダーターゲットの全幅と全高にレンダリングします。rect プロパティを使うと、レンダリングを矩形範囲に制限できます。矩形は0〜1の正規化座標で [x, y, width, height] として指定します(原点は左下隅です)。

2プレイヤーの水平分割画面では、2つのカメラがそれぞれ画面の半分を使用します:

Horizontal splitscreen

// プレイヤー1: 画面の左半分
camera1.camera.rect = new pc.Vec4(0, 0, 0.5, 1);

// プレイヤー2: 画面の右半分。camera1 の後にレンダリング
camera2.camera.rect = new pc.Vec4(0.5, 0, 0.5, 1);
camera2.camera.priority = 1;

垂直分割画面の場合は、代わりにビューポートを縦に積み重ねます。上が [0, 0.5, 1, 0.5]、下が [0, 0, 1, 0.5] です:

Vertical splitscreen

関連するプロパティとして scissorRect があります。これは同じ正規化形式の矩形でレンダリングをクリップしますが、ビューポートへの投影方法は変更しません。

レイヤー

各カメラは、自身の layers プロパティにリストされたレイヤーのみをレンダリングするため、カメラごとにシーンのまったく異なるサブセットを表示できます。典型的な用途としては、ゲームの上にUIレイヤーだけをレンダリングするUIカメラ、エフェクトレイヤーをスキップするミニマップカメラ、一人称視点での武器のレンダリングなどがあります。実例はCamera Model Maskingチュートリアルを参照してください。

カメラスタッキング

あるカメラを別のカメラの上にレンダリングする場合(ピクチャインピクチャのオーバーレイや、異なるレイヤーセットを描画するフルスクリーンカメラなど)、後のカメラ(priority が大きい方)が先のカメラの画像を消してしまわないようにする必要があります。必要に応じてクリアフラグを無効にします:

// メインビューの上、右下隅にオーバーレイカメラをレンダリングする
overlay.camera.priority = 1;
overlay.camera.rect = new pc.Vec4(0.7, 0, 0.3, 0.3);
overlay.camera.clearColorBuffer = true; // オーバーレイは独自の背景を持つ
overlay.camera.clearDepthBuffer = true; // メインビューと深度テストしない

// メインビューに重ねて合成するフルスクリーンオーバーレイの場合:
// overlay.camera.clearColorBuffer = false;

レンダーターゲット

カメラは画面の代わりに、renderTarget プロパティに RenderTarget を割り当てることで、オフスクリーンテクスチャにレンダリングできます。生成されたテクスチャはマテリアルに適用して、ゲーム内のスクリーン、鏡、ポータルなどに使ったり、さらに加工したりできます。エンジンのレンダーテクスチャのサンプルを参照してください:

Render to Texture

パフォーマンスに関する考慮事項

  • 有効なカメラはそれぞれ自身のレイヤーを再度レンダリングします。ドローコールはカメラの数に比例して増加します。各カメラの layers は、実際に必要な最小限に制限してください。
  • カメラの rect を小さくすると塗りつぶすピクセル数は減りますが、レンダリングするオブジェクトのドローコールごとのCPUコストは減りません。
  • カメラごとのポストプロセッシングはカメラ単位で実行されるため、分割画面ビューにエフェクトを適用するとGPUコストが倍増します。
  • たまにしか更新が必要ないレンダーターゲット(静的な鏡など)は、毎フレーム更新する必要はありません。カメラを無効にしておき、必要なときに有効にしてください。