nDisplay 개요

nDisplay 렌더링 네트워크에서 여러 컴퓨터가 함께 작동하는 방법을 설명합니다.

모든 nDisplay 구성은 프라이머리 컴퓨터 한 대와 보조 노드라고 부르는 1개 이상의 추가 컴퓨터로 이뤄집니다.

  • 네트워크의 컴퓨터마다 언리얼 엔진 프로젝트를 인게임 또는 패키지 포맷으로 하나 이상 실행합니다.

  • 각 언리얼 엔진 인스턴스는 화면, LED 디스플레이, 프로젝터 등 하나 이상의 디바이스에 대한 렌더링을 처리합니다.

  • 언리얼 엔진 인스턴스가 처리하는 각 디스플레이 디바이스에 대해 동일한 뷰 원점 또는 뷰포인트를 공유하는 뷰포트를 렌더링합니다. 이 시점의 3D 월드 위치가 현실 세계의 화면이나 투영 표면의 물리적 위치에 일치하도록 뷰포트를 구성하면 보는 사람이 가상 세계에 있는 듯한 몰입감 넘치는 느낌을 줄 수 있습니다.

  • 프라이머리 노드는 라이브 링크를 통한 가상현실 주변장치 네트워크(VRPN) 연결을 통해 공간 트래커와 컨트롤러의 입력을 받아 해당 입력을 연결된 모든 컴퓨터에 리플리케이트하는 작업도 담당합니다.

nDisplay network overview

|

|

애플리케이션 인스턴스 하나, 디스플레이 디바이스별 호스트 컴퓨터
nDisplay 호스트를 구성하는 가장 간단한 방법입니다. 필요한 각 프로젝터 또는 물리적 디스플레이 디바이스에 대해 하나의 컴퓨터를 구성하여 해당 디바이스에 대한 렌더링을 처리합니다. 해당 컴퓨터에서 프로젝트를 실행하는 언리얼 엔진 인스턴스를 하나 실행합니다. 일반적으로 이 시나리오에서는 단일 3D 씬 뷰를 단일 뷰포트로 렌더링하도록 해당 애플리케이션 인스턴스를 구성합니다.

|

|

|

애플리케이션 인스턴스 하나, 다수의 디스플레이 디바이스별 호스트 컴퓨터
이 옵션을 사용하면 컴퓨터별로 언리얼 엔진 인스턴스를 하나만 실행하여 씬의 3D 공간 뷰 여러 개를 렌더링하도록 구성할 수 있습니다. 출력 매핑 툴을 사용하면 별도의 뷰포트가 애플리케이션 창이라고 부르는 대형 2D 캔버스의 여러 영역에 매핑됩니다.

NVIDIA Mosaic 또는 AMD Eyefinity 같은 그래픽 카드 업체의 멀티 디스플레이 기술을 활용하는 것을 권장합니다. 이렇게 하면 언리얼 엔진이 수집된 화면을 전체 화면으로 렌더링하여 디스플레이 동기화 및 퍼포먼스를 향상시킬 수 있습니다. 이 시나리오에서는 이와 같은 확장된 디스플레이 캔버스에서 nDisplay 출력 매핑 툴을 사용하여 모든 뷰포트를 매핑할 수 있습니다.

퍼포먼스 향상을 위해 뷰포트 렌더링에 보조 GPU를 사용할 수도 있습니다. 이 경우, 모든 픽셀이 복사된 후 디스플레이 측 GPU에서 해당 픽셀을 사용할 수 있게 되면 애플리케이션 창에서 컴포짓되고 GPU 출력으로 전송됩니다. 그래픽 카드를 여러 개 사용하는 것에 대한 자세한 내용은 멀티 GPU 지원을 참고하세요.

|

nDisplay 컴포넌트

nDisplay가 일반적인 언리얼 시스템 아키텍처에 여러 컴포넌트를 추가합니다.

  • 언리얼 엔진 내에서 작동하는 플러그인입니다. 클러스터를 구성하는 모든 애플리케이션 인스턴스 간에 정보를 통신하고 동기화하여 모든 인스턴스가 동시에 같은 프레임을 렌더링하는지, 각 디스플레이 디바이스가 게임 월드의 올바른 프러스텀을 렌더링하는지 여부 등을 확인합니다.

  • nDisplay가 올바른 컴퓨터에서 올바른 수의 인스턴스를 실행하는 데 필요한 모든 세팅을 포함하는 공유된 환경설정 에셋입니다. 각 인스턴스는 해당 게임의 3D 월드를 올바른 시점에서 렌더링하여 모든 디스플레이 화면 또는 프로젝터에 걸쳐 끊김없이 렌더링되는 것처럼 보이게 합니다. 자세한 내용은 nDisplay 3D 환경설정 에디터(nDisplay 3D Config Editor)를 참고하세요.

워크플로

네트워크에서 사용할 서로 다른 컴퓨터와 이러한 컴퓨터로 렌더링할 스크린 또는 프로젝터의 크기 및 해상도, 3D 공간 내에서의 스크린 간 공간적 관계 등에 대해 nDisplay에 알려줘야 합니다. 이렇게 하려면 이 정보를 모두 일련의 세팅으로 표현하는 환경설정 에셋을 생성해야 합니다.

일반적으로 환경설정 에셋을 한번 구성한 후에는 네트워크 토폴로지가 변경된 경우에만 수정하면 됩니다. 예를 들어 렌더링하고 있는 컴퓨터를 변경해야 하거나, 현실 세계의 화면 및 디스플레이의 물리적 배열을 변경해야 하는 경우를 들 수 있습니다.

nDisplay 클러스터 구성의 일반적인 워크플로는 다음과 같습니다.

  1. 언리얼 에디터에서 새 nDisplay 환경설정 에셋을 생성합니다.

  2. nDisplay 3D 환경설정 에디터에서 nDisplay 환경설정 에셋(nDisplay Config Asset)을 구성합니다.

    1. 컴포넌트 : 루트 컴포넌트에 디스플레이, 카메라 및 트랜스폼을 추가합니다.

    2. 클러스터 : 클러스터 PC 환경설정의 표현을 생성하고 뷰포트 및 GPU ID를 할당합니다. 기본적으로 PC 및 뷰포트를 추가합니다.

    3. 출력 매핑 : 언리얼 엔진 애플리케이션 창에 뷰포트를 효과적으로 매핑합니다. 디스플레이, 화면 또는 메시 컴포넌트(Mesh Component)에 프로젝션 정책을 할당하고 뷰포트를 바인딩합니다.

  3. nDisplay 환경설정 에셋을 레벨 뷰포트로 드래그하여 nDisplay 루트 액터(Root Actor)를 만든 후 클러스터의 시점에서 프로젝트 콘텐츠를 프리뷰합니다.

  4. 스위치보드(Switchboard)를 사용하여 실제 nDisplay 구성에서 프로젝트를 실행합니다.

사용자의 컴퓨터에서 샘플 nDisplay 환경설정을 시작하려면 nDisplay 퀵스타트에 나와 있는 단계를 따릅니다.

nDisplay 클러스터를 실행할 때는 nDisplay 루트 액터가 레벨에 없어도 됩니다. nDisplay 플러그인이 프로젝트에서 활성화되어 있는 경우 스위치보드 내에서의 nDisplay 환경설정 에셋(.uasset 또는 .ndisplay 파일) 위치를 지정하거나 nDisplay 환경설정 파일(.cfg 또는 .ndisplay)을 명령줄 인수로 지정할 수 있습니다. 이 방법은 인게임 및 패키지드 모드에서 작동합니다.

환경설정 에셋이 프로젝트에 이미 액터로 존재할 때, 스위치보드 또는 명령줄 인수를 사용하여 외부에서 지정할 경우 이 에셋은 무시됩니다.

멀티 GPU 지원

nDisplay는 뷰포트 렌더링에 멀티 GPU(mGPU)를 지원하므로, GPU 디바이스를 하나 지정하여 특정 뷰포트를 렌더링하고 다른 GPU로 프레임을 복사하여 표시할 수 있습니다. 예를 들어 버추얼 프로덕션 및 인카메라 VFX 시나리오의 경우, 내부 프러스텀은 두 번째 GPU에서 모두 렌더링함으로써 퍼포먼스와 하드웨어 활용도를 개선할 수 있습니다.

NVLink를 갖춘 NVIDIA GPU의 경우, CPU를 바이패스하여 GPU 간에 GPU 메모리를 직접 전송할 수 있습니다. NVLink가 없는 경우 모든 메모리 전송이 피어 투 피어(P2P) 방식으로 진행되지만 PCIe를 통해 CPU를 거쳐야 하므로 속도가 느릴 수 있습니다.

nDisplay 구성에서 mGPU를 활성화하려면 다음 단계를 따릅니다.

  1. nDisplay 3D 환경설정 에디터에서 nDisplay 환경설정 에셋을 엽니다.

  2. 컴포넌트 패널에서 환경설정 에셋을 선택하여 '디테일' 패널을 연 후 환경 설정(Configuration) > 렌더 프레임 세팅(Render Frame Settings) > 멀티 GPU 모드(Multi GPU Mode)활성화됨(Enabled) 으로 설정합니다.

  3. 뷰포트 렌더링의 경우: nDisplay 3D 환경설정 에디터에서 뷰포트를 선택한 후 해당 '디테일' 패널에서 'GPUIndex' 필드를 사용자 GPU의 인덱스로 설정합니다.

    뷰포트 디테일 패널의 GPU 인덱스 파라미터

    내부 프러스텀 렌더의 경우: nDisplay 3D 환경설정 에디터에서 ICVFX 카메라를 선택한 후 해당 '디테일' 패널에서 'GPUIndex' 필드를 사용자 GPU의 인덱스로 설정합니다.

    ICVFX 카메라 디테일 패널의 GPU 인덱스 세팅

    일반적으로 컴퓨터에 설치 및 활성화된 첫 번째 GPU는 0 으로 참조되고, 나머지 GPU는 1, 2, ... , n 으로 참조됩니다. OS에서 제공되는 GPU 디바이스 번호는 컴퓨터 세팅에서 찾을 수 있습니다. 예를 들어 Windows의 경우 '작업 관리자(Task Manager)'에서 GPU 디바이스 번호를 확인할 수 있습니다.

    1. '작업 관리자'를 엽니다.

    2. '퍼포먼스(Performance)' 탭으로 전환합니다.

    3. 창 왼쪽을 보면 머신에 설치된 모든 GPU와 디바이스 번호가 표시되어 있습니다.

      이름이 'GPU 0'인 GPU 하나만 표시하는 태스크 매니저 창

  4. nDisplay 노드 아래의 스위치보드 세팅에서 GPU 수(Number of GPUs) 를 nDisplay 노드의 GPU 수와 일치하게 설정합니다.

    GPU 수가 2로 설정된 스위치보드 세팅

런타임 카메라 컨트롤

nDisplay는 환경설정 파일에서 구성한 버추얼 3D 공간 내의 씬 오브젝트 계층구조를 내부적으로 유지합니다. 이 씬 계층구조는 보통 카메라화면 세트, 즉 현실 세계의 디스플레이 화면이나 가상 세계의 프로젝션 표면 등을 나타내는 3D 공간의 사각형 위치를 정의합니다. 이러한 nDisplay 씬 오브젝트의 위치는 항상 가상 공간의 원점 (0,0,0)에 위치한 단일 루트 에 상대적으로 정의됩니다.

nDisplay가 활성화된 프로젝트를 실행할 때, 이 가상 공간의 루트는 레벨 내 카메라에 어태치되어 있는 DisplayClusterRoot 컴포넌트의 위치 및 회전을 기반으로 합니다. nDisplay는 매 프레임마다 이 루트 컴포넌트의 위치 및 회전을 환경설정 파일에서 구성된 씬 노드 계층구조의 시작 지점으로 사용합니다.

기본적으로 nDisplay는 실행될 때 'DisplayClusterRoot' 컴포넌트를 생성하여 디폴트 카메라에 어태치합니다. 그 효과는 전체 nDisplay 클러스터의 모든 디바이스와 프로젝터가 활성화된 카메라의 모든 시점에서 씬을 자동으로 렌더링하도록 만드는 것입니다.

블루프린트 API

블루프린트 API를 사용하여 게임의 런타임 로직에서 nDisplay 시스템의 동작을 컨트롤할 수 있습니다.

이 API에서 노출된 함수에 접근하려면 다음 단계를 따릅니다.

  1. 클러스터 관리, 입력 디바이스 쿼리, nDisplay 렌더링 등과 관련된 대부분의 nDisplay 블루프린트 함수의 경우 블루프린트에서 N Display > DisplayCluster Module API 노드를 새로 만듭니다.

  2. 노드의 출력 API(Out API) 핀에서 드래그하여 디스플레이 클러스터(Display Cluster) 카테고리 아래를 봅니다.

    디스플레이 클러스터 블루프린트 API

nDisplay 확장

nDisplay는 여러 컴퓨터와 출력 디바이스에서 실시간으로 동기화된 렌더링을 컨트롤하는 데 바로 사용할 수 있는 수많은 기능을 제공합니다. 하지만 프로젝션 시스템 및 디스플레이 표면의 종류는 굉장히 다양하기 때문에 사용자가 선택한 기술을 지원하려면 nDisplay 렌더링 시스템을 확장해야 할 수도 있습니다. C++ 프로그래밍에 익숙하고 일반적인 사용 사례에서의 nDisplay 작동 방식을 잘 이해하고 있다면 nDisplay의 확장 가능한 렌더링 API를 바탕으로 빌드 작업을 통해 추가 디스플레이 및 보정 기술을 지원하도록 확장할 수 있습니다.

nDisplay API는 렌더링 파이프라인을 다음과 같은 몇 가지 주요 개념으로 나눕니다.

  • DisplayClusterRenderingDevice 는 본질적으로 네이티브 IStereoRendering 인터페이스의 확장입니다.

  • DisplayClusterPostProcess 는 포스트 프로세싱을 특정 뷰포트에 적용하는 데 사용할 수 있는 여섯 개의 콜백 집합입니다.

  • DisplayClusterProjectionPolicy 는 스케일 조절 가능한 디스플레이, VIOSO, DomeProjection 또는 MPCDI를 지원하는 커스텀 프로젝션 방식을 담당하여 곡면 또는 임의의 표면을 렌더링하거나 단순 평면 프로젝션을 렌더링합니다.

  • DisplayClusterRenderSyncPolicynvSwapLock, vSync 또는 24hz 디스플레이용 커스텀 스킵 프레임 싱크 등 다양한 동기화 방식에 사용됩니다.

위에서 설명한 엘리먼트를 사용자의 필요에 맞게 생성하면 nDisplay 시스템에 의해 제작된 이미지를 사용자가 작업할 프로젝션이나 디스플레이 기술에 맞도록 커스터마이징할 수 있으며, 출시된 언리얼 엔진 소스 코드를 전혀 변경할 필요 없이 nDisplay 클러스터 시스템의 핵심적인 이점까지 동시에 모두 누릴 수 있습니다.

위 엘리먼트의 구현 구성 방식을 보여주는 작동 모델은 PicpProjectionPicpMPCDI 모듈의 소스 코드를 참고하세요. 두 모듈은 Engine/Plugins/Runtime/nDisplay/Source 경로 아래의 언리얼 엔진 소스 코드에서 찾을 수 있습니다.

사용자의 커스텀 키-값 쌍을 nDisplay 클러스터에 제공할 수도 있습니다. 환경설정 에셋의 '디테일' 패널에 있는 '커스텀 파라미터(Custom Parameters)' 필드에는 파라미터와 값을 필요한 만큼 포함시킬 수 있습니다. 그런 다음 런타임에서 nDisplay 블루프린트 또는 C++ API에서 이러한 환경설정을 얻을 수 있습니다.

커스텀 파라미터를 추가하려면 다음 단계를 따릅니다.

  1. 3D 환경설정 에디터 를 열고 '컴포넌트' 패널에서 self 를 선택하여 해당 디테일 패널을 엽니다.

  2. 디테일 패널에서 환경설정(Configuration) 섹션을 펼쳐 커스텀 파라미터 필드에 엘리먼트를 추가합니다.

    nDisplay 클러스터에 커스텀 파라미터 추가

지원 운영 체제

Windows

모든 nDisplay 툴 및 기능은 Windows 10, 8.1, 8 및 7에서 완전하게 작동합니다.

Linux

nDisplay 및 해당 툴 생태계는 이제 예비 Linux 지원을 포함합니다. 따라서 다양한 Linux 배포판에서 언리얼 엔진을 실행하는 사용자에게 도움이 되며, 특히 클러스터 구성 환경에서 교육 및 시뮬레이션 중인 사용자에게는 더 큰 도움이 됩니다.

Linux에서 알려진 제한 사항

  • 커스텀 동기화 정책에는 기존 그래픽 카드 드라이버 지원으로 인해 일부 제한 사항이 있습니다.

  • 다른 벤더에 의존하는 일부 프로젝션 정책은 검증이 필요합니다.

  • 레이 트레이싱과 같은 일부 렌더링 기능은 현재 지원되지 않습니다.