このガイドでは、特にインカメラ VFX (ICVFX) と LED ウォールを操作する場合に、NVIDIA Rivermax を使用して SMPTE 2110 を nDisplay で動作するように設定するための手順を説明します。
nDisplay の ICVFX カメラ ストリーミング
メディア共有とオフスクリーン レンダリングの統合により、SMPTE 2110 メディア ソースと出力を活用してクラスタのパフォーマンスをより最適化できるようになります。 各 ICVFX カメラのレンダリングを専用のマシンに移動し、SMPTE 2110 のマルチキャスト機能を使用して、それらのカメラ ストリームを、それらに依存する他のノードに配信できます。
つまり、レンダリング ノードをカメラのレンダリング専用にすることができ、一般的に、すべてのレンダリング ノードですべてのインナー フラスタムをレンダリングするよりもスケーラビリティが向上します。 この構成では、UE がピクセルをウォールに送信する方法は変更されません。 コンポジタ ノードは、出力を同期送信するために同期カードを使用します。 ただし、インナー フラスタムのレンダリング専用のレンダリング ノードには同期カードは必要ありません。 また、この構成では、UE インスタンス間で共有される SMPTE 2110 ストリームに PTP タイミングは使用されません。
3 つのノードと 2 台の ICVFX カメラで構成されるクラスタの構成例を示します。 この例では、既存のステージ構成から始めて、これらの新機能を活用するための変換プロセスを示します。
ノードの構成
コンテンツ ブラウザで、検索してから nDisplay コンフィギュレーションを開きます。 この例では、NDC_MyStage という名前になっています。
この構成では、壁を動かすノードが 3 つあり、それぞれがビューポートのセットをレンダリングします。 これらは変更されません。
ノード ビューポート Node_1
VP_W1
Node_2
VP_W2
Node_3
VP_C1 VP_C2
ICVFX カメラが 2 台あります。 それぞれについて、[+Add (+追加)] をクリックして、[Add New Cluster Node (新しいクラスタ ノードを追加)] を選択して、そのカメラをレンダリングするために使用するノードを作成します。
各ノードについて、以下の手順を実行します。
レンダリングするカメラを識別する名前を付けます。
[Adjust Cluster Node Position to Prevent Overlap (重ならないようにクラスタ ノードの位置を調整)] を無効にします。
[Add Viewport to New Cluster Node (新しいクラスタ ノードにビューポートを追加)] を無効にします。
必要なホスト IP を設定します。
[Headless Rendering (ヘッドレス レンダリング)] を有効にします。
システムに複数のグラフィック アダプタがある場合は、グラフィック アダプタを設定します。
完全に構成されると、[Add New Cluster Node (新しいクラスタ ノードを追加)] ダイアログボックスは次の画像のようになります。
ノードの作成が完了すると、クラスタは次の画像のようになります。
メディア構成–ICVFX カメラ A の出力
カメラのフラスタムをレンダリングするためのノードを構成したら、メディア共有を構成します。
ステージ アウトライナーで、[ICVFXCameraA] を選択します。
[Details] パネルで、[Media (メディア)] セクションを見つけます。
[Enabled (有効)] チェックボックスにチェックを入れます。
メディア出力グループを追加します。 ここでは、どのノードがこのインナー フラスタムをレンダリングするか、およびそれがどのように共有されるかを構成します。
このカメラをレンダリングするノードは、ICVFXCameraA の Node_CamA です。 ICVFXCameraB を構成する場合は、Node_CamB を選択します。
[MediaOutput type (MediaOutput タイプ)] を [Nvidia Rivermax Output (Nvidia Rivermax 出力)] にするように構成し、ST 2110 を使用して共有します。 ここでのいくつかの設定は重要です。
[Alignment Mode (アライメント モード)] を [Frame Creation (フレーム作成)] に設定します。つまり、出力では、レンダリングされたフラスタムが利用可能になるとすぐにストリーミングが開始され、ストリームに構成されたフレーム間隔が常に尊重されます。
レンダリングされるすべてのフレームを確実に共有する場合、[Frame Locking Mode (フレーム ロック モード)] を [Block On Reservation (予約時にブロック)] に設定します。
[DoFrameCounterTimestamp] を有効にします。 これにより、Unreal Engine のフレーム番号がビデオ ストリームに埋め込まれ、どのサンプルがどのフレームに対応するかを、受信ノードが認識するために使用されます。
UE はキャプチャされると自動的にフラスタムのサイズを検出するため、解像度の強制は不要です。
[Frame Rate (フレーム レート)] は重要です。 SDI と同様に、2110 規格は動画フレームをフレーム間隔全体にわたって転送します。 2110 動画ストリームを 24 fps で設定した場合、各フレームがリスナーに完全に受信されるまでに 41 ms かかります。 レイテンシーを最小限に抑えるには、ネットワーク カードの利用可能な帯域幅に応じて、フレーム レートをクラスタのレートよりも速く設定します。 つまり、24 fpsで動作するクラスタの場合、インナー フラスタムをこれよりも速くストリーミングする必要があります。 48 fps、60 fps、またはそれ以上のフレーム レートを使用することをお勧めしますが、帯域幅の使用量を考慮してください。
[Interface Address (インターフェース アドレス)] にはワイルドカードを使用することで、異なる IP アドレスを持つ複数のマシンで動作するように、設定を可能な限り柔軟にすることができます。
[Stream Address (ストリーミング アドレス)] には、2 つのインナー フラスタムが同じアドレスでストリーミングすることを避けるため、一意のマルチキャスト アドレスを選択します。 同じアドレスでストリーミングした場合、受信側はそれらを区別できなくなります。 ここに示す例では、カメラ A は 225.1.1.10 を使用し、カメラ B は 225.1.1.11 を使用します。
このストリームはウォールに送信されるわけではないため、キャプチャ同期は必要ありません。
出力構成は次の画像のようになります。
メディア構成–ICVFX カメラ A の入力
ICVFXCameraA レンダリングの出力側の構成が完了したので、受信側の構成に移ります。 ここでは、共有レンダリングを受信するノードと、その受信方法を構成します。
最初に、メディア入力グループを追加します。
クラスタ ノードを追加してこの出力を受信します。 この場合、壁を動かすすべてのノード (Node_1、Node_2、Node_3) が必要です。
ST 2110 を使用して共有レンダリングを受信するには、[Media Source (メディア ソース)] を [Rivermax Media Source (Rivermax Media ソース)] に設定します。 低レイテンシーのフレームロックを機能させるには、いくつかの設定を正しく行う必要があります。
[Player Mode (プレイヤー モード)] に [Framelock (フレームロック)] を使用して、受信側がレンダリングごとに予想されるフレームを待機するようにします。 埋め込まれたフレーム番号を使用して、UE の受信インスタンスは動画サンプルを現在のフレーム番号と一致させることができます。 フレームがまだ到着していない場合、受信インスタンスは到着すると想定して待機します。
[Use Zero Latency (ゼロ レイテンシーを使用)] オプションを使用すると、受信側 UE インスタンスが現在のフレーム番号と一致するフレーム番号を、追加のレイテンシーなしで待機するようにできます。 コンテンツによってはこれが実現できない場合があるため、1 フレームのレイテンシーを追加して、インナーの待機に余裕を持たせるオプションがあります。
[Resolution (解像度)] は、ストリームの受信時に受信側 UE インスタンスによって自動検出されるため、強制する必要はありません。
[Frame Rate] は、出力に使用したものと同じレートに設定します。
[Interface Address] には、ワイルドカードを使用します。これは、クラスタの複数のノードで使用されるため、ノード間でインターフェース IP が異なるためです。
[Stream Address] と [Port (ポート)] は、出力構成に合わせて設定します。
GPU Direct を有効にすることはできますが、GPU と DPU (Mellanox カード) が同じルート コンプレックスに存在することを確認します。 そうでない場合、特に複数の入力ストリームがある場合、2110 パケットが失われる可能性があります。
入力時に GPU Direct を完全に有効にするには、Unreal Engine の起動時または Rivermax ストリームを開始する前に
Rivermax.GPUDirectInput=1を設定します。
入力構成は次の画像のようになります。
ICVFXCameraA が、1 つのレンダリング ノードからクラスタに共有されるように構成されました。 メディア設定は次のようになります。
メディア構成–ICVFX カメラ B
ICVFXCameraA の構成が完了したら、ICVFXCameraB を構成できます。ICVFXCameraB では、次の詳細を除いてほぼ同じ設定が使用されます。
メディア出力グループ
クラスタ ノードのレンダリング ICVFXCameraB は Node_CamB になります。
[Stream Address] は異なるものにする必要があります。 225.1.1.11 を使用しますが、同じポート番号を使用します。
メディア入力グループ
[Stream Address] は出力構成に合わせて変更する必要がある唯一の設定です。この例では 225.1.1.11 です。
より高速なフレーム レートを 2110 ストリームに使用することでレイテンシーを削減できます。 ただし、帯域幅のコストは増加するため、ネットワーク構成に応じてこの点に注意してください。 同じネットワーク上で他のデバイスが帯域幅を使用している場合は、それらも考慮する必要があります。
帯域幅の使用例
4k24 RGB10
~ 6.3Gb/s
4k48 RGB10
~ 12.6Gb/s
8k24 RGB10
~ 25Gb/s
8k48 RGB10
~ 50Gb/s
nDisplay ICVFX カメラ ストリーミングおよび同期出力 (実験的機能)
要件
更新できる nDisplay のもう 1 つの点は、レンダリング画像を LED ウォールに送信する方法です。 GPU からストリームを送信する代わりに、ネットワーク カードから直接 ST 2110 ストリームを送信できるようになりました。 各ノードに共通の PTP 時間基準を提供することで、同期カードに頼ることなく、LED ウォールに送信される各ストリームをフレームロックして同期できます。
そのためには次のことが必要です。
PTP を生成するマスター クロック。
ST 2110 ストリームをサポートするスイッチ。
ConnectX-6 BlueField-2 カードなどの準拠した Nvidia ネットワーク カード。
LED プロセッサは ST 2110 ストリームも受信できる必要があります。
このように構成すると、すべてのノードがヘッドレスまたはオフスクリーンとして構成されます。 GPU を使用してストリーミングしないため、モザイクの設定や EDID 設定は不要になります。 ただし、各ノードに送信される PTP 時間基準は常に有効である必要があります。
この構成が機能するには、デプロイメント フェーズで説明した PTP 設定に関するオプションのセクションが必須です。
構成の基本
nDisplay コンフィギュレーションに関して、この機能は ICVFX カメラのストリーミング構成方法を変更するものではありません。 代わりに、この機能はノード レベルで設定できるメディア出力構成を利用して、特定のノードによってレンダリングされた最終的なバック バッファをストリーミング出力します。 フレームロックも構成する必要があります。
各ノードのウィンドウ サイズを構成する際、ストリームを受信する LED プロセッサによっては制約が課される場合があります。 同じプロセッサが 2 つのストリームを受信する場合、各ストリームのサイズを同じにすることが必要になる場合があります。 前述の同じサンプル クラスタでこの制約を適用する方法を以下に示します。
この例では、Node_1、Node_2、Node_3 の 3 つのノードから送信します。 解像度の制約がないため、ノードのウィンドウを可能な限り狭くすることで、必要なピクセル数を最小限に抑えることができます。 この場合、制約を追加して、Node_1 と Node_2 のウィンドウを同じサイズに設定します。 これらは同じ LED プロセッサを使用していると見なします。 Node_3 のストリームにはこの制約がないため、ウィンドウ サイズは同じではありません。
ノード構成–Node_1 と Node_2
Node_1 構成と Node_2 構成から始めます。 元の構成では、以下のようになっています。
Node_1 は、ウィンドウ サイズが 7680x2160、ビューポートが 2640x1408 の全画面ノードを使用していました。
Node_2 は、ウィンドウ サイズが 3840x2160、ビューポートが 3344x1408 の全画面ノードを使用していました。
ビューポート VP_W2 が最大なので、Node_1 と Node_2 の設定を同一にし、VP_W2 のサイズを 3344x1408 にします。
[Headless Rendering] 設定を有効にして両方のノードをオフスクリーンに設定し、全画面設定を無効にします。
この変更により、Node_2 のストリームの寸法に合わせるために、Node_1 のストリームにピクセルが追加されました。 ビューポートがすべて同じサイズでない場合は、無駄な帯域幅を最小限に抑えるために、ノードごとにビューポートをどのように構成するかを検討することが重要です。
次に、各ノードのメディア出力を構成します。 メディアは、ノード レベル (最終バック バッファ) とビューポート レベルで構成できます。 最終的なコンポジット済みおよびワープ済み結果を送信するには、ノードでこの構成を行うことが重要です。
Node_1 を選択して、その [Media] セクションを確認します。
[Media] 構成を有効にします。
メディア出力を追加します。
[Media Output (メディア出力)] を [NVIDIA Rivermax Output (NVIDIA Rivermax 出力)] にするように構成し、それに応じて設定を構成します。
Alignment Mode:AlignmentPoint。 PTP 時間基準を使用して出力をゲンロックに合わせる必要があるため、出力を既知のアライメント ポイントに送信する必要があります。
Do Continuous Output (連続出力):True。 フレームが時間内にレンダリングされなかった場合、出力は継続され、前のフレームが繰り返される必要があります。
Frame Locking Mode (フレーム ロック モード):Block on Reservation. レンダリング対象のすべてのフレームをストリーミングします。
Presentation Queue Size (プレゼンテーション キュー サイズ):2. レイテンシーを最小限に抑えるには、ダブル バッファリングが最適です。
Number of Texture Buffers (テクスチャ バッファ数):3. これには厳しい要件はありません。
Resolution:チェックなし。 解像度を設定する必要はありません。 チェックを外すと、ノードのバック バッファのサイズを使用してストリームが作成されます。
Frame Rate:プロジェクトに依存しています。 例では 24fps を使用していますが、プロジェクトによって異なる設定を使用している場合があります。
Pixel Format (ピクセル形式):RGB10. これはプロジェクトによって異なる場合があり、受信側 (LED プロセッサ) がその形式をサポートしている必要があります。
Interface Address:10.69.70.。 この例では、すべてのノードがサブネット 10.69.70. に属しています。これにより、各ノードをレンダリングするマシンの変更が容易になります。 最後のオクテットにワイルドカードを使用すると、選択されたノードはローカル インターフェース アドレスに解決できます。
Stream Address:一意の Node_1 ストリーミング アドレス。 この例では、225.1.2.1 を使用し、各ノードの最後のオクテットを増やすことで、ノードごとに固有のマルチキャスト アドレスを設定します。 衝突を避けるため、ここで使用するマルチキャスト グループがネットワーク上でまだ使用されていないことを確認してください。
Port:50000。 この例では、すべてのノードに 50000 が使用され、マルチキャスト アドレスのみが変更されます。
Use GPUDirect (GPUDirectを使用):FALSE。 現時点では、フレームロックされた ST 2110 出力にサポートされていません。
Rivermax (PTP) を使用するように [Capture Synchronization (キャプチャ同期)] を構成します。 これにより、クラスタ全体に共通の PTP 時間基準を活用する Ethernet 同期バリアを使用して、クラスタ全体でフレームロックを強制するメカニズムが有効になります。
Margin (ms) (マージン (ms)):5. デフォルト値を使用します。 これは、フレームを表示用のキューに入れる直前、ノードがキャプチャ同期バリアに入る直前に参照される時間マージンです。 次のアライメント ポイントに (マージン分だけ) 近すぎると検出された場合、バリアへの進入を遅らせます。
Barrier Timeout (ms) (バリアタイムアウト (ms)):3000. デフォルト値を使用します。 これは、タイムアウト期間が終了する前にすべてのノードが参加していない場合、バリアを終了するためのタイムアウトです。
Node_1 の構成はこれで完了です。設定は次のようになります。
Node_1 の構成が完了したら、Node_2 の構成に進みます。 Node_2 の設定は、一意である必要がある [Stream Address] を除けば Node_1 と同一である必要があります。
Node_1 と同様に、Node_2 設定を構成します。
225.1.2.2 を使用するように、Node_2 の [Stream Address] を設定します。
Node_2 の最終的な構成を次に示します。
ノードの構成–Node_3
Node_3 の構成に進みます。 上記の元の例では、2 つのビューポートの間に隙間がありました。
無駄なスペースを減らすには、ビューポートを構成して隙間をなくすことができます。
次に、Node_1 および Node_2 の場合と同様に、このノードをヘッドレスに設定し、ウィンドウ サイズを両方のビューポートを格納するために必要な最小サイズに調整します。
7680x2160 を使用する代わりに、ウィンドウのサイズを 6336x1408 に設定します。
[Headless Rendering] を有効にします。
次に、Node_3 のメディア出力を構成します。 この場合も、クラスタ内で一意である必要ストリーミング アドレスを除いて、設定は Node_1 および Node_2 と同じになります。
Node_1 および Node_2 と同様に、Node_3 設定を構成します。
225.1.2.3 を使用するように、Node_3 の [Stream Address] を設定します。
この構成が完了すると、クラスタは 5 つのマルチキャスト グループを使用するようになります。
225.1.1.10:50000:ICVFXCameraA
225.1.1.11:50000:ICVFXCameraB
225.1.2.1:50000:Node_1
225.1.2.2:50000:Node_2
225.1.2.3:50000:Node_3
Node_3 の最終的な構成を次に示します。