nDisplay の概要

nDisplay レンダリング ネットワークで複数台のコンピュータがどのように連携するかについて説明します。

Windows
MacOS
Linux

すべての nDisplay のセットアップは、単一の マスター コンピュータと任意の台数の追加のコンピュータで構成されます。

  • ネットワークの各コンピュータは、プロジェクトのパッケージ化された実行ファイルの 1 つ以上のインスタンスを実行します。

  • Unreal Engine の各インスタンスでは、スクリーン、プロジェクターなどの 1 台以上のディスプレイ デバイスへのレンダリングを処理します。

  • Unreal Engine のインスタンスが処理する各デバイスが、同一の 3D シーン上の単一の視点をレンダリングします。これらの視点を、3D ワールドでの位置が現実世界のスクリーンまたは投影されたサーフェスの物理的な位置に一致するように設定することで、視聴者に仮想ワールド内にいるような錯覚をもたらします。

  • また、マスター ノードは、VRPN (Virtual-Reality Peripheral Networks) への接続を介して空間トラッカーおよびコントローラーからの入力を受け入れ、その入力を他のすべての接続コンピュータにレプリケートします。

nDisplay network overview

この図は、設定可能な nDisplay ネットワークを示しています。すべての nDisplay ネットワークと同様に、1 台の PC がマスター ノードとして機能します。このマスター ノードは、VRPN サーバーからシステムへの入力を受け入れます。VRPN サーバーでは、空間トラッキング デバイスやその他のコントローラー デバイスからの信号を中継します。このネットワークには、Unreal Engine プロジェクトの他のインスタンスを実行する他の PC も複数台含まれています。これらそれぞれのクラスタ ノードが、1 台以上のディスプレイ プロジェクターを制御します。

単一のアプリケーション インスタンスで 1 台のディスプレイ デバイスにレンダリングする。
これは、nDisplay の 1 台のホストをセットアップする最もシンプルな方法です。必要なプロジェクターまたはディスプレイ デバイスごとに、1 台のコンピュータをセットアップして、そのデバイスに対するレンダリングを処理します。そのコンピュータでは、Unreal Engine の単一のインスタンスを実行します。通常、このシナリオでは、3D 空間の単一の長方形を単一のビューポートにレンダリングするように、そのアプリケーション インスタンスを設定します。

複数のアプリケーション インスタンスのそれぞれが 1 台のディスプレイ デバイスにレンダリングする。
複数のグラフィックス カードを搭載し、複数台のディスプレイ デバイスの制御を処理できる複数台のコンピュータがネットワークにある場合、それらのコンピュータで Unreal Engine の複数のインスタンスを実行できます。Unreal Engine の各インスタンスに 3D 空間の 1 つの個別の長方形をレンダリングするよう指示し、それぞれの長方形を 1 つの個別のグラフィックス カードにディスパッチします。
このアプローチは、プロジェクトの CPU およびメモリの要件が低く、同一コンピュータ上で複数のインスタンスを十分実行できる場合は、適切に機能します。

単一のアプリケーション インスタンスで複数台のディスプレイ デバイスにレンダリングする。
このオプションでは、コンピュータ上で Unreal Engine アプリケーションの単一のインスタンスを実行します。ただし、シーンの 3D 空間の複数の個別の長方形を大きなウィンドウの異なる領域にレンダリングするように設定します。次に、NVIDIA MosaicNVIDIA Surround などのテクノロジーを使用して、その 1 つの大きなウィンドウを分割し、他のディスプレイ デバイスの個別の各領域にレンダリングします。
このシナリオで Mosaic または Surround と nDisplay を組み合わせて使用するメリットは、お使いのさまざまなモニターが同一平面上に並んで配置されていない場合でも、それらのモニターの物理的な配置に正確に一致するビューポートをレンダリングできる点です。ただし、すべてのビューポートは Unreal Engine の同一のインスタンスによってレンダリングされるため、同一のコンピュータに複数のグラフィックス カードが搭載されていてもメリットはありません。

nDisplay のコンポーネント

nDisplay では通常の Unreal システム アーキテクチャにコンポーネントをいくつか追加します。

  • Unreal Engine 内で機能するプラグイン。このプラグインでは、クラスタを構成するすべてのアプリケーション インスタンス間で情報をやり取りして、同期することで、すべてのインスタンスが同一フレームを同時にレンダリングできるようにしたり、各ディスプレイ デバイスがゲーム ワールドなどの正しい視錐台をレンダリングしたりできるようにします。

  • nDisplay で適切な台数のコンピュータで適切な数のインスタンスを起動するために必要なすべての設定が指定されている共有コンフィギュレーション アセット。各コンピュータが、ゲームの 3D ワールドの適切な視点をレンダリングすることで、すべてのディスプレイ スクリーンまたはプロジェクターにまたがるシームレスなレンダリングによる錯覚を生み出します。詳細については、「nDisplay 3D コンフィグ エディタ」を参照してください。

ワークフロー

ネットワークで使用する必要のあるさまざまなコンピュータ、それらのコンピュータのレンダリング先のスクリーンまたはプロジェクターのサイズと解像度、3D 空間でのそれらのスクリーン間の空間的な関係などについて nDisplay に指示する必要があります。これを行うためには、一連の設定でこれらすべての情報を指定するコンフィギュレーション アセットを作成します。

通常、コンフィギュレーション アセットの設定後は、それを変更する必要はありません。ただし、ネットワークのトポロジが変更された場合は除きます。例えば、レンダリング先のコンピュータを変更する必要がある場合や、現実世界でスクリーンやディスプレイの物理的な配置が変更される場合などがこれに該当します。

nDisplay クラスタをセットアップする一般的なワークフローは、次のとおりです。

  1. Unreal Editor で新しい nDisplay コンフィグ アセットを作成します。

  2. nDisplay 3D コンフィグ エディタで nDisplay コンフィグ アセットを設定します。

    1. コンポーネント: ディスプレイ、カメラ、トランスフォームをルートコンポーネントに追加します。

    2. クラスタ: クラスタ PC コンフィギュレーションの表現を作成し、ビューポートと GPU ID を割り当てます。基本的には、PC のものとビューポートを追加します。

    3. 出力マッピング: ビューポートを UE アプリケーション ウィンドウに効果的にマッピングします。投影ポリシーを割り当て、ビューポートをディスプレイ、スクリーン、またはメッシュ コンポーネントにバインドします。

    Create the nDisplay Config Asset

  3. nDisplay コンフィグ アセットをレベル ビューポートにドラッグして nDisplay ルート アクタを作成し、クラスタの観点からプロジェクトのコンテンツをプレビューします。

    Create the nDisplay Root Actor

  4. スイッチボード を使用して、プロジェクトを物理的な nDisplay セットアップで起動します。

コンピュータでサンプルの nDisplay コンフィギュレーションを開始するには、 「nDisplay クイックスタート」の手順に従ってください。

NDisplay ルート アクタは nDisplay クラスタを起動するためにレベル内で必要ではありません。プロジェクトで nDisplay プラグインを有効にすると、コマンドライン引数として、スイッチボードまたは nDisplay コンフィグ ファイル (.cfg または .ndisplay) で nDisplay コンフィグ アセット (.uasset または .ndisplay ファイル) の場所を指定できます。 このメソッドはインゲームまたはパッケージ モードで使用することができます。

スイッチボードまたはコマンドライン引数を使って外部でコンフィグ アセットを指定すると、プロジェクトのアクタとして既に存在していたコンフィグ アセット (ある場合) は無視されます。

マルチ GPU のサポート

nDisplay はビューポート レンダリング用に multi-GPU (mGPU) をサポートしているので、特定のビューポートをレンダリングするために 1 つの GPU デバイスを指定して、フレームを別の GPU にコピーして表示することができます。バーチャル プロダクションとインカメラ VFX の例では、インナー フラスタムは 2 つめの GPU で完全にレンダリングすることができるので、パフォーマンスとハードウェア使用量が改善します。

NVLink を備えた NVIDIA 製の GPU では、CPU をバイパスして、GPU から GPU にメモリを直接転送できます。NVLink がない場合でもメモリ転送はピアツーピア (P2P) になります。しかし、この場合は PCIe を使用して CPU を経由する必要があるため、速度が低下する可能性があります。

nDisplay セットアップで mGPU を有効にするには、次を実行します。

  1. nDisplay 3D コンフィグ エディタで nDisplay コンフィグ アセットを開きます。

  2. [Components (コンポーネント)] パネルで、[Config Asset (コンフィグ アセット)] を選択して [Details] パネルを開き、[Configuration (コンフィギュレーション)] > [Render Frame Settings (レンダリングフレーム設定)] > [Multi GPU Mode (マルチ GPU モード)][Enabled (有効)] に設定します。

  3. ビューポートのレンダリングの場合: nDisplay 3D コンフィグ エディタ で、ビューポートを選択し、その [Details] パネルで [GPUIndex] フィールドを GPU のインデックスに設定します。

    enable-mGPU-viewpoint.png

    インナー フラスタムのレンダリングの場合: nDisplay 3D コンフィグ エディタ で、ICVFX カメラを選択し、その [Details] パネルで [GPUIndex] フィールドを GPU のインデックスに設定します。

    enable-mGPU-ICVFX.png

    通常、コンピュータにインストールおよび有効化された最初の GPU は 0 と呼ばれます。その他の GPU は 1、2、... 、n と数字が増えていきます。OS によって割り当てられた現在使用している GPU デバイス番号は、コンピュータの設定から確認できます。Windows の場合、GPU デバイス番号は タスクマネージャー で確認できます。

    1. タスクマネージャー を開きます。

    2. [Performance (パフォーマンス)] タブに切り替えます。

    3. ウィンドウの左側にはマシンに入っている GPU とデバイス番号が表示されます。

      gpu-0.jpg

      GPU 0

  4. スイッチボード を介して nDisplay を起動するときに、カスタムコマンドライン引数に Add MaxGPUCount=2 を追加します。

ランタイム カメラの制御

内部で、nDisplay はコンフィギュレーション ファイルで設定した仮想 3D スペースでシーン オブジェクトの階層を維持します。たとえば、このシーン階層は通常、 カメラ の位置と 画面 一式 (現実世界のディスプレイ スクリーンまたは仮想世界のプロジェクション サーフェスを表す3D スペースの長方形) の位置を定義します。NnDisplay シーン オブジェクトの位置は、仮想スペースの基点 (0,0,0) に常に置かれる単一の ルート 位置に関連して定義されます。

NnDisplay を有効にしてプロジェクトを実行する場合、この仮想スペースのルートはレベル内のカメラにアタッチされた DisplayClusterRoot コンポーネントの位置と回転に基づきます。フレームごとに、nDisplay はこのルート コンポーネントの位置と回転を、nDisplay コンフィギュレーション ファイルで設定したシーン ノードの階層に対する開始点として使用します。

デフォルトで、nDisplay はスタートアップで DisplayClusterRoot コンポーネントを作成し、デフォルト カメラにアタッチします。その結果、nDisplay クラスタ全体のすべてのデバイスとプロジェクターがアクティブ カメラの視点からのシーンを自動的にレンダリングします。

ブループリント API

ブループリント API を使用して、ゲームのランタイム ロジックで nDisplay システムのビヘイビアを制御できます。

これらの API で公開されている関数を利用するには、次の手順を実行します。

  1. クラスタ管理、入力デバイスのクエリ、nDisplay レンダリングなどに関連するほとんどの nDisplay ブループリント関数では、ブループリントで新しい [N Display (N ディスプレイ)] > Get DisplayCluster Module API ノードを作成します。

  2. ノードの [Out API (出力 API)] ピンをドラッグして、[Display Cluster (ディスプレイ クラスタ)] または [Display Cluster Input (ディスプレイ クラスタ入力)] カテゴリを確認します。

nDisplay を拡張する

nDisplay では、複数台のコンピュータと出力デバイス間でリアルタイムの同期レンダリングを制御するための、すぐに使用できる多くの機能を提供しています。ただし、多岐にわたる投影システムとディスプレイ サーフェスが存在するため、nDisplay レンダリング システムを拡張して、自分が選んだテクノロジーをサポートする必要がある場合があります。C++ のプログラミングに慣れており、nDisplay が一般的なユース ケースでどのように機能するかを理解している場合は、拡張可能なレンダリング API に基づいて構築することにより、nDisplay を拡張して追加のディスプレイおよびキャリブレーション テクノロジーをサポートできます。

nDisplay API では、レンダリング パイプラインを次のような複数の主要な概念に分割します。

  • DisplayClusterRenderingDevice: 基本的にネイティブ インターフェースの拡張です。

  • DisplayClusterPostProcess: 特定のビューポートに後処理を適用するために使用できる 6 つのコールバックのグループです。

  • DisplayClusterProjectionPolicy: ーブしたサーフェスにレンダリングするためのスケーラブル ディスプレイまたは MPCDI のサポート、または単純な平面投影の実行など、カスタマイズされた投影メソッドの処理を担います。

  • DisplayClusterRenderSyncPolicy: nvSwapLock、vSync、または 24hz ディスプレイ向けのカスタマイズされたスキップフレーム同期など、さまざまな同期方法に対応するために使用されます。

上記の要素の独自の特殊化を作成することにより、nDisplay システムが生成する画像を、使用するあらゆる投影テクノロジーまたはディスプレイ テクノロジーに合わせてカスタマイズできるだけでなく、リリースされている Unreal Engine のソース コードを変更する必要なく nDisplay クラスタリング システムのすべての主要なメリットを活用することができます。

これらの要素の実装を設定する方法の作業モデルについては、PicpProjection モジュールおよび PicpMPCDI モジュールのソース コードを参照してください。これらのモジュールは、Engine/Plugins/Runtime/nDisplay/Source の Unreal Engine のソースコードにあります。

独自にカスタムしたキー / 値のペアを nDisplay クラスター ノードに与えることができます。コンフィグ アセットの [Details] パネルにある [Custom Parameters] にパラメータと値を必要とするだけ含めることができます。後でこれらの設定値を実行時に nDisplay ブループリントまたは C++ API から取得することができます。

パラメータは以下の手順で追加します。

  1. 3D Config Editor の [Components] パネルで [self] を選択して [Details] パネルで開きます。

  2. [Details] パネルで [Configuration] セクションを展開して [Custom Parameters] フィールドに要素を追加します。

    Adding Custom Parameters to your nDisplay cluster

サポートされるオペレーティング システム

Windows

すべての nDisplay ツールおよび機能は、Windows 10、8.1、8、および 7 で完全に機能します。

Linux

nDisplay とツール エコシステムには、予備的な Linux サポートが含まれるようになりました。クラスタ化されたセットアップ環境で、さまざまな種類の Linux ディストリビューション、特にトレーニングやシミュレーションで UE を実行しているユーザーにとってメリットになります。

Linux の既知の制限事項

  • カスタム同期ポリシーには、既存のグラフィックカード ドライバーのサポートにより、いくつかの制限があります。

  • 他のベンダーに依存するプロジェクション ポリシーには検証が必要なものがあります。

  • レイトレーシングなどの一部のレンダリング機能は、現時点ではサポートされていません。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる