모든 nDisplay 구성은 프라이머리 컴퓨터 한 대와 보조 노드라고 부르는 1개 이상의 추가 컴퓨터로 이뤄집니다.
-
네트워크의 컴퓨터마다 언리얼 엔진 프로젝트를 인게임 또는 패키지 포맷으로 하나 이상 실행합니다.
-
각 언리얼 엔진 인스턴스는 화면, LED 디스플레이, 프로젝터 등 하나 이상의 디바이스에 대한 렌더링을 처리합니다.
-
언리얼 엔진 인스턴스가 처리하는 각 디스플레이 디바이스에 대해 동일한 뷰 원점 또는 뷰포인트를 공유하는 뷰포트를 렌더링합니다. 이 시점의 3D 월드 위치가 현실 세계의 화면이나 투영 표면의 물리적 위치에 일치하도록 뷰포트를 구성하면 보는 사람이 가상 세계에 있는 듯한 몰입감 넘치는 느낌을 줄 수 있습니다.
-
프라이머리 노드는 라이브 링크를 통한 가상현실 주변장치 네트워크(Virtual-Reality Peripheral Network, VRPN) 연결을 통해 공간 트래커와 컨트롤러의 입력을 받아 해당 입력을 연결된 모든 컴퓨터에 리플리케이트하는 작업도 담당합니다.
위 이미지는 nDisplay 네트워크의 구성 예시를 보여줍니다. 모든 nDisplay 네트워크와 마찬가지로 해당 네트워크에 속한 PC 중 한 대가 프라이머리 노드의 역할을 합니다. 이 프라이머리 노드는 VRPN 서버에서 시스템으로 입력을 받으며, 이 서버는 공간 트래킹 디바이스에서 오는 신호를 다른 컨트롤러 디바이스에 중계합니다. 이 네트워크에는 언리얼 엔진 프로젝트 다른 인스턴스를 실행하는 다른 PC 도 포함되어 있습니다. 이 보조 노드 각각은 하나 이상의 디스플레이 프로젝터를 구동합니다.
애플리케이션 인스턴스 하나, 디스플레이 디바이스별 호스트 컴퓨터 |
|
애플리케이션 인스턴스 하나, 다수의 디스플레이 디바이스별 호스트 컴퓨터 NVIDIA Mosaic 또는 AMD Eyefinity 같은 그래픽 카드 업체의 멀티 디스플레이 기술을 활용하는 것을 권장합니다. 이렇게 하면 언리얼 엔진이 수집된 화면을 전체 화면으로 렌더링하여 디스플레이 동기화 및 퍼포먼스를 향상할 수 있습니다. 이 시나리오에서는 이와 같은 확장된 디스플레이 캔버스에서 nDisplay 출력 매핑 툴을 사용하여 모든 뷰포트를 매핑할 수 있습니다. 퍼포먼스 향상을 위해 뷰포트 렌더링에 보조 GPU를 사용할 수도 있습니다. 이 경우, 모든 픽셀이 복사된 후 디스플레이 측 GPU에서 해당 픽셀을 사용할 수 있게 되면 애플리케이션 창에서 컴포짓되고 GPU 출력으로 전송됩니다. 그래픽 카드를 여러 개 사용하는 것에 대한 자세한 내용은 [멀티 GPU 지원](#(멀티GPU지원)을 참고하세요. |
nDisplay 컴포넌트
nDisplay가 일반적인 언리얼 시스템 아키텍처에 여러 컴포넌트를 추가합니다.
- 언리얼 엔진 내에서 작동하는 플러그인입니다. 클러스터를 구성하는 모든 애플리케이션 인스턴스 간에 정보를 커뮤니케이션하고 동기화하여 모든 인스턴스가 동시에 같은 프레임을 렌더링하는지, 각 디스플레이 디바이스가 게임 월드의 올바른 프러스텀을 렌더링하는지 여부 등을 확인합니다.
- nDisplay가 올바른 컴퓨터에서 올바른 수의 인스턴스를 실행하는 데 필요한 모든 세팅을 포함하는 공유된 환경설정 에셋입니다. 각 인스턴스는 해당 게임의 3D 월드를 올바른 시점에서 렌더링하여 모든 디스플레이 화면 또는 프로젝터에 걸쳐 끊김없이 렌더링되는 것처럼 보이게 합니다. 자세한 내용은 nDisplay 3D 환경설정 에디터(nDisplay 3D Config Editor)를 참고하세요.
워크플로
네트워크에서 사용할 서로 다른 컴퓨터와 이러한 컴퓨터로 렌더링할 스크린 또는 프로젝터의 크기 및 해상도, 3D 공간 내에서의 스크린 간 공간적 관계 등에 대해 nDisplay에 알려줘야 합니다. 이렇게 하려면 이 정보를 모두 일련의 세팅으로 표현하는 환경설정 에셋을 생성해야 합니다.
일반적으로 환경설정 에셋이 구성된 후에는 네트워크 토폴로지가 변경될 때만 이를 수정하면 됩니다. 예를 들어 렌더링 대상 컴퓨터를 변경해야 하는 경우 또는 현실 세계에서 화면 및 디스플레이의 물리적 배열을 변경해야 하는 경우가 있습니다.
nDisplay 클러스터 구성의 일반적인 워크플로는 다음과 같습니다.
- 언리얼 에디터에서 새 nDisplay 환경설정 에셋을 생성합니다.
- nDisplay 3D 환경설정 에디터에서 nDisplay 환경설정 에셋(nDisplay Config Asset)을 구성합니다.
- 컴포넌트: 루트 컴포넌트에 디스플레이, 카메라 및 트랜스폼을 추가합니다.
- 클러스터: 클러스터 PC 환경설정의 표현을 생성하고 뷰포트 및 GPU ID를 할당합니다. 기본적으로 PC 및 뷰포트를 추가합니다.
- 출력 매핑: 언리얼 엔진 애플리케이션 창에 뷰포트를 효과적으로 매핑합니다. 디스플레이, 화면 또는 메시 컴포넌트(Mesh Component)에 투영 정책을 할당하고 뷰포트를 바인딩합니다.
-
nDisplay 환경설정 에셋을 레벨 뷰포트로 드래그하여 nDisplay 루트 액터(Root Actor)를 생성한 후 클러스터의 시점에서 프로젝트 콘텐츠를 프리뷰합니다.
- 스위치보드(Switchboard)를 사용하여 실제 nDisplay 구성에서 프로젝트를 실행합니다.
사용자의 컴퓨터에서 샘플 nDisplay 환경설정을 시작하려면 nDisplay 퀵스타트에 나와 있는 단계를 따릅니다.
nDisplay 클러스터를 실행할 때는 nDisplay 루트 액터가 레벨에 없어도 됩니다. nDisplay 플러그인이 프로젝트에서 활성화되어 있는 경우 스위치보드 내에서의 nDisplay 환경설정 에셋(.uasset 또는 .ndisplay 파일) 위치를 지정하거나 nDisplay 환경설정 파일(.cfg 또는 .ndisplay)을 명령줄 실행인자로 지정할 수 있습니다. 이 방법은 인게임 및 패키징됨 모드에서 작동합니다.
환경설정 에셋이 프로젝트에 이미 액터로 존재하는 경우에는 스위치보드 또는 명령줄 실행인자를 사용하여 외부에서 지정할 경우 이 에셋은 무시됩니다.
페일오버
영구적이든 임시적이든 설치된 모든 클러스터 시스템은 오류의 위험에 노출되어 있습니다. 오류는 하드웨어, 소프트웨어 또는 네트워크 문제로 인해 발생할 수 있습니다. 페일오버란 시스템이 전체 클러스터를 종료하지 않고서도 실패 위험을 완화하고 실패한 노드에서 복구하는 방법을 가리킵니다.
nDisplay의 현재 대체 작동 구현은 렌더 노드의 검색 가능한 네트워크 오류만 해결합니다. 즉, 충돌로 인해 또는 네트워크 연결이 끊어져 렌더 노드가 응답하지 않으면 환경설정 가능한 타임오버 값이 지난 후에 클러스터에서 삭제됩니다.
페일오버 활성화
nDisplay 페일오버 지원을 활성화하려면 nDisplay 3D 환경설정 에디터에서 '클러스터 디테일(Cluster Details)' 패널을 열고 '페일오버 정책(Failover Policy)'을 '실패 시 S 노드 드롭(Drop S-node on fail)'으로 설정합니다.
이 옵션을 활성화하면 타임아웃 값을 초과하는 렌더 노드가 클러스터에서 삭제됩니다. 페일오버에 사용되는 타임아웃 값은 클러스터의 네트워크 세팅에서 찾을 수 있습니다. 네트워크 세팅에 대한 자세한 내용은 nDisplay 커뮤니케이션 포트 변경을 참고하세요.
노드 중 하나라도 시간 내에 응답하지 않고 배리어가 타임아웃되면 해당 노드는 오류가 발생한 것으로 간주되며 페일오버 정책이 활성화될 때 클러스터에서 삭제됩니다.
멀티 GPU 지원
nDisplay는 뷰포트 렌더링에 멀티 GPU(mGPU)를 지원하므로, GPU 디바이스를 하나 지정하여 특정 뷰포트를 렌더링하고 다른 GPU로 프레임을 복사하여 표시할 수 있습니다. 버추얼 프로덕션과 인카메라 VFX 사용 사례를 예로 들면, 내부 프러스텀을 전적으로 두 번째 GPU에서 렌더링할 수 있으므로 퍼포먼스와 하드웨어 점유율이 향상됩니다.
NVLink를 갖춘 NVIDIA GPU의 경우, CPU를 바이패스하여 GPU 간에 GPU 메모리를 직접 전송할 수 있습니다. NVLink가 없는 경우 모든 메모리 전송이 피어 투 피어(P2P) 방식으로 진행되지만 PCIe를 통해 CPU를 거쳐야 하므로 속도가 느릴 수 있습니다.
nDisplay 구성에서 mGPU를 활성화하려면 다음 단계를 따릅니다.
- nDisplay 3D 환경설정 에디터에서 nDisplay 환경설정 에셋을 엽니다.
- 컴포넌트 패널에서 환경설정 에셋을 선택하여 '디테일' 패널을 연 후 환경 설정(Configuration) > 렌더 프레임 세팅(Render Frame Settings) > 멀티 GPU 모드(Multi GPU Mode) 를 활성화됨(Enabled) 으로 설정합니다.
-
뷰포트 렌더링의 경우: nDisplay 3D 환경설정 에디터에서 뷰포트를 선택한 후 해당 '디테일' 패널에서 'GPUIndex' 필드를 사용자 GPU의 인덱스로 설정합니다.
내부 프러스텀 렌더의 경우: nDisplay 3D 환경설정 에디터에서 ICVFX 카메라를 선택한 후 해당 '디테일' 패널에서 'GPUIndex' 필드를 사용자 GPU의 인덱스로 설정합니다.
일반적으로 컴퓨터에 첫 번째로 설치되어 활성화된 GPU가 0 으로 레퍼런스되고, 다른 GPU는 순차적으로 1, 2, ... , n 으로 할당됩니다. OS에서 제공되는 GPU 디바이스 번호는 컴퓨터 세팅에서 찾을 수 있습니다. 예를 들어 Windows의 경우 '작업 관리자(Task Manager)'에서 GPU 디바이스 번호를 확인할 수 있습니다.
- '작업 관리자'를 엽니다.
- '퍼포먼스(Performance)' 탭으로 전환합니다.
-
창 왼쪽을 보면 머신에 설치된 모든 GPU와 디바이스 번호가 표시되어 있습니다.
-
nDisplay 노드 아래의 스위치보드 세팅에서 GPU 수(Number of GPUs) 를 nDisplay 노드의 GPU 수와 일치하게 설정합니다.
런타임 카메라 컨트롤
nDisplay는 환경설정 파일에서 구성한 버추얼 3D 공간 내의 씬 오브젝트 계층구조를 내부적으로 유지합니다. 예를 들어 이 씬 계층구조는 보통 카메라 와 화면 세트, 즉 현실 세계의 디스플레이 화면이나 가상 세계의 투영 표면 등을 나타내는 3D 공간의 사각형 위치를 정의합니다. 이러한 nDisplay 씬 오브젝트의 위치는 항상 가상 공간의 원점 (0,0,0)에 위치한 단일 루트 에 상대적으로 정의됩니다.
nDisplay가 활성화된 프로젝트를 실행할 때, 이 가상 공간의 루트는 레벨 내 카메라에 어태치되어 있는 DisplayClusterRoot 컴포넌트의 위치 및 회전을 기반으로 합니다. nDisplay는 프레임마다 이 루트 컴포넌트의 위치 및 회전을 환경설정 파일에서 구성된 씬 노드 계층구조의 시작 지점으로 사용합니다.
기본적으로 nDisplay는 스타트업 시 'DisplayClusterRoot' 컴포넌트를 생성하여 디폴트 카메라에 어태치합니다. 그 효과는 전체 nDisplay 클러스터의 모든 디바이스와 프로젝터가 활성화된 카메라의 모든 시점에서 씬을 자동으로 렌더링하도록 만드는 것입니다.
블루프린트 API
블루프린트 API를 사용하여 게임의 런타임 로직에서 nDisplay 시스템의 행동을 컨트롤할 수 있습니다.
이 API 에 노출된 함수를 구하려면 다음 단계를 따릅니다.
- 클러스터 관리, 입력 디바이스 쿼리, nDisplay 렌더링 등과 관련된 대부분의 nDisplay 블루프린트 함수의 경우 블루프린트에서 N Display > DisplayCluster Module API 노드를 새로 만듭니다.
-
노드의 출력 API(Out API) 핀에서 드래그하여 디스플레이 클러스터(Display Cluster) 카테고리 아래를 봅니다.
nDisplay 확장
nDisplay는 여러 컴퓨터와 출력 디바이스에서 실시간으로 동기화된 렌더링을 컨트롤하는 데 바로 사용할 수 있는 수많은 기능을 제공합니다. 하지만 투영 시스템 및 디스플레이 표면의 종류는 굉장히 다양하기 때문에 사용자가 선택한 기술을 지원하려면 nDisplay 렌더링 시스템을 확장해야 할 수도 있습니다. C++ 프로그래밍에 익숙하고 일반적인 사용 사례에서의 nDisplay 작동 방식을 잘 이해하고 있다면 nDisplay의 확장 가능한 렌더링 API를 기반으로 빌드 작업을 통해 추가 디스플레이 및 캘리브레이션 기술을 지원하도록 확장할 수 있습니다.
nDisplay API는 렌더링 파이프라인을 다음과 같은 몇 가지 주요 개념으로 나눕니다.
- DisplayClusterRenderingDevice 는 본질적으로 네이티브
IStereoRendering인터페이스의 확장입니다. - DisplayClusterPostProcess 는 포스트 프로세싱을 특정 뷰포트에 적용하는 데 사용할 수 있는 여섯 개의 콜백 집합입니다.
- DisplayClusterProjectionPolicy 는 스케일 조절 가능한 디스플레이, VIOSO, DomeProjection 또는 MPCDI를 지원하는 커스텀 투영 방식을 담당하여 곡면 또는 임의의 표면을 렌더링하거나 단순 평면 투영을 렌더링합니다.
- DisplayClusterRenderSyncPolicy 는 nvSwapLock, vSync 또는 24hz 디스플레이용 커스텀 스킵 프레임 동기화 등 다양한 동기화 방식에 사용됩니다.
위에서 설명한 엘리먼트를 사용자의 필요에 맞게 생성하면 nDisplay 시스템에 의해 제작된 이미지를 사용자가 작업할 투영이나 디스플레이 기술에 맞도록 커스터마이징할 수 있으며, 출시된 언리얼 엔진 소스 코드를 전혀 수정할 필요 없이 nDisplay 클러스터 시스템의 핵심적인 이점까지 동시에 모두 누릴 수 있습니다.
위 엘리먼트의 구현 구성 방식을 보여주는 작동 모델은 PicpProjection 및 PicpMPCDI 모듈의 소스 코드를 참고하세요. 두 모듈은 Engine/Plugins/Runtime/nDisplay/Source 경로 아래의 언리얼 엔진 소스 코드에서 찾을 수 있습니다.
사용자의 커스텀 키-값 쌍을 nDisplay 클러스터에 제공할 수도 있습니다. 환경설정 에셋의 '디테일' 패널에 있는 '커스텀 파라미터(Custom Parameters)' 필드에는 파라미터와 값을 필요한 만큼 포함시킬 수 있습니다. 그런 다음 런타임에서 nDisplay 블루프린트 또는 C++ API에서 이러한 환경설정 값을 얻을 수 있습니다.
커스텀 파라미터를 추가하려면 다음 단계를 따릅니다.
- 3D 환경설정 에디터 를 열고 '컴포넌트' 패널에서 self 를 선택하여 해당 디테일 패널을 엽니다.
-
디테일 패널에서 환경설정(Configuration) 섹션을 펼쳐 커스텀 파라미터 필드에 엘리먼트를 추가합니다.
지원 운영 체제
Windows
모든 nDisplay 툴 및 기능은 Windows 10, 8.1, 8 및 7에서 완전하게 작동합니다.
Linux
nDisplay 및 해당 툴 생태계는 이제 Linux 예비 지원을 포함합니다. 따라서 다양한 Linux 배포판에서 언리얼 엔진을 실행하는 사용자에게 도움이 되며, 특히 클러스터 구성 환경에서 교육 및 시뮬레이션 중인 사용자에게는 더 큰 도움이 됩니다.
Linux에서 알려진 제한 사항
- 커스텀 동기화 정책에는 기존 그래픽 카드 드라이버 지원으로 인해 일부 제한 사항이 있습니다.
- 다른 벤더에 의존하는 일부 투영 정책은 검증이 필요합니다.
- 레이 트레이싱과 같은 일부 렌더링 기능은 현재 지원되지 않습니다.