すべての nDisplay 環境は、単一の プライマリ コンピュータと、セカンダリ ノードと呼ばれる追加のコンピュータ (任意の台数) で構成されます。
-
ネットワークの各コンピュータは、Unreal プロジェクトのインスタンス (複数可) をインゲームまたはパッケージ化された形式のいずれかで実行します。
-
Unreal Engine の各インスタンスでは、スクリーン、LED ディスプレイ、プロジェクターなどの 1 台以上のディスプレイ デバイスへのレンダリングを処理します。
-
Unreal Engine のインスタンスで処理される各デバイスでは、同じビューの原点または視点を共有するビューポートをレンダリングします。3D ワールドでの位置が現実世界のスクリーンまたは投影されたサーフェスの物理的な位置と一致するようにこれらのビューポートを設定することで、視聴者に仮想ワールド内にいるような錯覚と没入感をもたらします。
-
また、プライマリ ノードは、Live Link 経由の VRPN (Virtual-Reality Peripheral Networks) への接続を介して空間トラッカーおよびコントローラーからの入力を受け入れ、その入力を接続されている他のすべてのコンピュータにレプリケートします。
この図は、設定可能な nDisplay ネットワークを示しています。 すべての nDisplay ネットワークと同様に、この中の 1 台の PC がプライマリ ノードとして機能します。 このプライマリ ノードでは、VRPN サーバーからシステムへの入力を受け入れます。VRPN サーバーでは、空間トラッキング デバイスやその他のコントローラー デバイスからの信号を中継します。 このネットワークには、Unreal Engine プロジェクトの他のインスタンスを実行する他の PC も複数台含まれています。 これらの各セカンダリ ノードでは、1 台以上のディスプレイ プロジェクターを制御します。
ディスプレイ デバイスにつき、1 台のアプリケーション インスタンスおよびホスト コンピュータ。 |
|
複数台のディスプレイ デバイスにつき、1 台のアプリケーション インスタンスおよびホスト コンピュータ。 接続された複数台のディスプレイを単一のディスプレイとして扱うには、NVIDIA Mosaic や AMD Eyefinity などのグラフィック カード ベンダーが提供するマルチディスプレイ技術を利用することをお勧めします。これにより、ディスプレイの同期とパフォーマンスを高めるために、集約されたこれらのスクリーンを Unreal によってフルスクリーンでレンダリングできることが確実になります。このシナリオでは、nDisplay Output Mapping ツールを使ってすべてのビューポートをこの拡張ディスプレイ キャンバスにマッピングできます。 パフォーマンス向上のために、2 番目の GPU をビューポートのレンダリングに利用することも可能です。すべてのピクセルがコピーされてディスプレイ対応の GPU で使用可能になると、それらがアプリケーション ウィンドウ内で合成されて GPU 出力に送信されます。複数のグラフィック カードを使用する方法については、「マルチ GPU のサポート」を参照してください。 |
nDisplay のコンポーネント
nDisplay では、通常の Unreal システム アーキテクチャに以下のコンポーネントをいくつか追加します。
- Unreal Engine 内で機能するプラグイン。このプラグインでは、クラスタを構成するすべてのアプリケーション インスタンス間で情報をやり取りして同期することで、すべてのインスタンスが同一フレームを同時にレンダリングできるようにしたり、各ディスプレイ デバイスがゲーム ワールドの正しい錐台をレンダリングしたりできるようにします。
- nDisplay で適切な台数のコンピュータで適切な数のインスタンスを起動するために必要なすべての設定が指定されている共有コンフィギュレーション アセット。各コンピュータでゲームの 3D ワールドの適切な視点をレンダリングすることで、すべてのディスプレイ スクリーンまたはプロジェクターにまたがるシームレスなレンダリングによる錯覚を生み出します。詳細については、「nDisplay 3D コンフィグ エディタ」を参照してください。
ワークフロー
ユーザーは、ネットワークで使用する必要のあるさまざまなコンピュータ、それらのコンピュータのレンダリング先のスクリーンまたはプロジェクターのサイズと解像度、3D 空間でのそれらのスクリーン間の空間的な関係などについて nDisplay に指示する必要があります。 これを行うためには、一連の設定でこれらすべての情報を指定するコンフィギュレーション アセットを作成します。
通常、コンフィギュレーション アセットの設定後は、それを変更する必要はありません。ただし、ネットワークのトポロジが変更された場合を除きます。たとえば、レンダリング先のコンピュータを変更する必要がある場合や、現実世界でスクリーンやディスプレイの物理的な配置が変更される場合などがこれに該当します。
nDisplay クラスタをセットアップする一般的なワークフローは、次のとおりです。
- Unreal Editor で新しい nDisplay コンフィグ アセットを作成します。
- nDisplay 3D コンフィグ エディタで nDisplay コンフィグ アセットを設定します。
- Components (コンポーネント):ディスプレイ、カメラ、トランスフォームをルート コンポーネントに追加します。
- Cluster (クラスタ):クラスタ PC コンフィギュレーションの表現を作成し、ビューポートと GPU ID を割り当てます。基本的には、PC のものとビューポートを追加します。
- Output Mapping (出力マッピング):ビューポートを UE アプリケーション ウィンドウに効果的にマッピングします。投影ポリシーを割り当て、ビューポートをディスプレイ、スクリーン、またはメッシュ コンポーネントにバインドします。
-
nDisplay コンフィグ アセットをレベル ビューポートにドラッグして nDisplay ルート アクタを作成し、クラスタの観点からプロジェクトのコンテンツをプレビューします。
- スイッチボード を使用して、プロジェクトを物理 nDisplay セットアップで起動します。
コンピュータでサンプルの nDisplay コンフィギュレーションを使用するには、「nDisplay クイック スタート」の手順に従ってください。
nDisplay クラスタを起動する上で、nDisplay ルート アクタをレベル内に配置する必要はありません。プロジェクトで nDisplay プラグインを有効にすると、コマンドライン引数として、スイッチボードまたは nDisplay コンフィグ ファイル (.cfg
または .ndisplay
) で nDisplay コンフィグ アセット (.uasset
または .ndisplay
ファイル) の場所を指定できます。この方法は、インゲームまたはパッケージ モードで使用することができます。
スイッチボードまたはコマンドライン引数を使って外部でコンフィグ アセットを指定すると、プロジェクトのアクタとしてすでに存在するコンフィグ アセット (ある場合) は無視されます。
フェイルオーバー
永続的か一時的かを問わず、インストール済みのすべてのクラスタ システムは、何らかの障害が発生するリスクにさらされています。障害は、ハードウェア、ソフトウェア、またはネットワークの問題に起因して発生します。フェイルオーバーとは、システムが障害のリスクを軽減し、クラスタ全体を終了することなく、ノードの障害から復旧する仕組みのことです。
nDisplay に現在実装されているフェイルオーバーは、レンダリング ノードのネットワーク検出可能な障害にのみ対応します。これは、クラッシュやネットワーク接続の切断などによってレンダリング ノードが応答しなくなると、設定可能なタイムアウト値の後にクラスタからドロップされることを意味します。
フェイルオーバーを有効にする
nDisplay でフェイルオーバーのサポートを有効にするには、nDisplay 3D コンフィグ エディタ の [Cluster Details (クラスタの詳細)] パネルを開いて、フェイルオーバー ポリシーを [Drop S-node on fail] に設定します。
このオプションが有効になっていると、タイムアウト値を超えた場合にレンダリング ノードがクラスタからドロップされます。フェイルオーバーに使用されているタイムアウト値は、クラスタのネットワーク設定で確認できます。ネットワーク設定の詳細については、「nDisplay 通信ポートを変更する」を参照してください。
いずれのノードも時間内に応答せず、バリアがタイムアウトした場合は、それらのノードで障害が発生しているとみなされ、フェイルオーバー ポリシーが有効になっている場合はクラスタからドロップされます。
マルチ GPU のサポート
nDisplay はビューポートのレンダリングにマルチ GPU (mGPU) をサポートしているため、1 つの GPU デバイスを指定して特定のビューポートをレンダリングし、そのフレームを別の GPU にコピーして表示させることができます。 バーチャル プロダクションとインカメラ VFX の例では、インナー錐台を 2 番目の GPU で完全にレンダリングできるので、パフォーマンスとハードウェア使用量が改善されます。
NVLink を備えた NVIDIA 製の GPU では、CPU をバイパスして、GPU から GPU にメモリを直接転送できます。 NVLink がない場合でもメモリ転送はピアツーピア (P2P) になります。ただし、この場合は PCIe を使用して CPU を経由する必要があるため、速度が低下する可能性があります。
nDisplay セットアップで mGPU を有効にするには、次の手順に従います。
- nDisplay 3D コンフィグ エディタで nDisplay コンフィグ アセットを開きます。
- [Components (コンポーネント)] パネルで、[Config Asset (コンフィグ アセット)] を選択して [Details (詳細)] パネルを開き、[Configuration (コンフィギュレーション)] > [Render Frame Settings (レンダリング フレーム設定)] > [Multi GPU Mode (マルチ GPU モード)] を [Enabled (有効)] に設定します。
-
ビューポートのレンダリングの場合: nDisplay 3D コンフィグ エディタ でビューポートを選択し、その [Details] パネルで [GPUIndex] フィールドを GPU のインデックスに設定します。
インナー フラスタムのレンダリングの場合: nDisplay 3D コンフィグ エディタで ICVFX カメラを選択し、その [Details] パネルで [GPUIndex] フィールドを GPU のインデックスに設定します。
通常、コンピュータにインストールされて有効になっている最初の GPU は 0 として参照され、他の GPU は 1、2、3...、 n と段階的に割り当てられていきます。OS によって割り当てられた現在使用している GPU デバイス番号は、コンピュータの設定から確認できます。たとえば Windows の場合、GPU デバイス番号は以下の手順に従ってタスク マネージャで確認できます。
- タスク マネージャを開きます。
- [Performance (パフォーマンス)] タブに切り替えます。
-
ウィンドウの左側に、マシンにあるすべての GPU とそのデバイス番号が表示されます。
-
nDisplay ノードの [Switchboard (スイッチボード)] の設定で、[Number of GPUs (GPU 数)] を nDisplay ノード内の GPU の数と一致するように設定します。
ランタイム カメラの制御
内部では、nDisplay がコンフィギュレーション ファイルで設定した仮想 3D スペースでシーン オブジェクトの階層を維持します。たとえば、このシーン階層は通常、カメラ の位置と 画面 一式 (現実世界のディスプレイ スクリーンまたは仮想世界のプロジェクション サーフェスを表す3D スペースの長方形) の位置を定義します。nDisplay シーン オブジェクトの位置は、仮想スペースの基点 (0,0,0) に常に置かれる単一の ルート 位置に関連して定義されます。
nDisplay を有効にしてプロジェクトを実行する場合、この仮想スペースのルートはレベル内のカメラにアタッチされた DisplayClusterRoot コンポーネントの位置と回転に基づきます。フレームごとに、nDisplay はこのルート コンポーネントの位置と回転を、nDisplay コンフィギュレーション ファイルで設定したシーン ノードの階層に対する開始点として使用します。
デフォルトで、nDisplay はスタートアップ時に DisplayClusterRoot コンポーネントを作成し、デフォルト カメラにアタッチします。 その結果、nDisplay クラスタ全体のすべてのデバイスとプロジェクターがアクティブ カメラの視点からのシーンを自動的にレンダリングします。
ブループリント API
ブループリント API を使用して、ゲームのランタイム ロジックで nDisplay システムの動作を制御できます。
これらの API で公開されている関数を利用するには、次の手順を実行します。
- クラスタ管理、入力デバイスのクエリ、nDisplay レンダリングなどに関連するほとんどの nDisplay ブループリント関数では、ブループリントで新しい N Display > DisplayCluster Module API ノードを作成します。
-
ノードの Out API (出力 API) ピンからドラッグして、[Display Cluster (ディスプレイ クラスタ)] カテゴリを確認します。
nDisplay を拡張する
nDisplay では、複数台のコンピュータと出力デバイス間でリアルタイムの同期レンダリングを制御するための、事前設定された多くの機能を提供しています。 ただし、さまざまな投影システムとディスプレイ サーフェスが存在するため、お使いのテクノロジーをサポートするために nDisplay レンダリング システムを拡張しなければならない場合があります。 C++ のプログラミングに慣れており、nDisplay が一般的なユース ケースでどのように機能するかを十分に把握している場合は、拡張可能なレンダリング API に基づいて構築することで、nDisplay を拡張して追加のディスプレイおよびキャリブレーション テクノロジーをサポートできます。
nDisplay API では、レンダリング パイプラインを次のような複数の主要な概念に分割します。
- DisplayClusterRenderingDevice。基本的にネイティブ
IStereoRendering
インターフェースの拡張です。 - DisplayClusterPostProcess。特定のビューポートにポストプロセスを適用するために使用できる 6 つのコールバックのグループです。
- DisplayClusterProjectionPolicy。カーブした任意のサーフェスにレンダリングするためのスケーラブル ディスプレイ、VIOSO、DomeProjection、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 からこれらの構成値を取得できるようになります。
カスタム パラメータは以下の手順で追加します。
- 3D コンフィグ エディタ の [Components] パネルで [self (自身)] を選択し、その [Details] パネルを開きます。
-
[Details] パネルの [Configuration] セクションを展開し、[Custom Parameters] フィールドに要素を追加します。
サポートされているオペレーティング システム
Windows
すべての nDisplay ツールと機能は、Windows 10、8.1、8、および 7 で完全に機能します。
Linux
nDisplay とそのツール エコシステムに予備的な Linux サポートが含まれるようになりました。 これは、クラスタ化されたセットアップ環境でさまざまな種類の Linux ディストリビューション、特にトレーニングやシミュレーションで UE を実行しているユーザーにとってメリットになります。
Linux での既知の制限事項
- カスタム同期ポリシーには、現行のグラフィック カード ドライバ サポートに起因する制限事項がいくつかあります。
- 他のベンダーに依存する投影ポリシーには検証が必要なものがあります。
- レイ トレーシングなどの一部のレンダリング機能は、現時点ではサポートされていません。