이 가이드에서는 특히 인카메라 VFX(ICVFX) 및 LED 월로 작업 시 nDisplay와 작동하도록 NVIDIA Rivermax를 사용하여 SMPTE 2110을 구성하는 방법에 대한 지침을 제공합니다.
nDisplay ICVFX 카메라 스트리밍
미디어 공유 및 오프스크린 렌더링을 통합하면 SMPTE 2110 미디어 소스 및 출력을 활용하여 클러스터의 성능을 더욱 최적화할 수 있습니다. 각 ICVFX 카메라의 렌더를 자체 머신으로 이동한 다음, SMPTE 2110의 멀티캐스트 기능을 사용해서 해당 카메라 스트림을 이러한 스트림에 의존하는 다른 노드에 전달할 수 있습니다.
즉, 렌더 노드가 카메라 렌더링을 전담하도록 할 수 있습니다. 이 경우 모든 렌더 노드에서 모든 내부 프러스텀을 렌더링하는 것보다 일반적으로 확장성이 더 뛰어납니다. 이 환경설정을 사용할 경우 UE가 월로 픽셀을 보내는 방식에는 변화가 없습니다. 컴포지터 노드는 출력을 동기식으로 전송하기 위해 여전히 동기화 카드를 사용합니다. 그렇지만 내부 프러스텀 렌더링을 전담하는 렌더 노드는 동기화 카드가 필요하지 않습니다. 또한 이 환경설정에서는 UE의 인스턴스 간에 공유되는 SMPTE 2110 스트림에 PTP 타이밍이 사용되지 않습니다.
다음은 3개의 노드 및 2개의 ICVFX 카메라로 이루어진 클러스터를 환경설정하는 방법을 보여 주는 예제입니다. 이 예제에서는 기존 스테이지 환경설정부터 시작해 이러한 새 추가 항목을 활용하도록 변환하는 프로세스를 보여 줍니다.
노드 환경설정
콘텐츠 브라우저에서 검색한 후 nDisplay 환경설정을 엽니다. 이 예제의 이름은 NDC_MyStage입니다.
이 환경설정에는 월을 구동하는 3개의 노드가 있으며 각 노드는 뷰포트 세트를 렌더링합니다. 이러한 노드는 수정되지 않습니다.
노드(Node) 뷰포트(Viewport) Node_1
VP_W1
Node_2
VP_W2
Node_3
VP_C1 VP_C2
2개의 ICVFX 카메라도 있습니다. 각 카메라에 대해 +추가(Add)를 클릭한 후 새 클러스터 노드 추가(Add New Cluster Node)를 선택하여 해당 카메라를 렌더링하는 데 사용할 노드를 생성합니다.
각 노드에 대해 다음을 수행합니다.
렌더링할 카메라를 식별하는 이름을 짓습니다.
클러스터 노드 위치를 조정하여 오버랩 방지(Adjust Cluster Node Position to Prevent Overlap)를 비활성화합니다.
새 클러스터 노드에 뷰포트 추가(Add Viewport to New Cluster Node)를 비활성화합니다.
원하는 호스트 IP를 설정합니다.
헤드리스 렌더링(Headless Rendering)을 활성화합니다.
시스템에 그래픽 어댑터가 2개 이상 있는 경우 그래픽 어댑터를 환경설정합니다.
완전히 환경설정되면 새 클러스터 노드 추가(Add New Cluster Node) 대화창이 다음 이미지와 비슷한 모습이 될 것입니다.
노드 생성이 완료되면 클러스터는 다음 이미지와 비슷한 모습이 될 것입니다.
미디어 환경설정 – ICVFX 카메라 A 출력
카메라 프러스텀 렌더링을 전담하는 노드를 환경설정했으면 계속해서 미디어 공유를 구성합니다.
스테이지 아웃라이너에서 ICVFXCameraA를 선택합니다.
디테일 패널에서 미디어(Media) 섹션을 찾습니다.
Enable(활성화) 체크박스를 체크합니다.
미디어 출력 그룹(Media Output Group)을 추가합니다. 여기서 이 내부 프러스텀을 렌더링할 노드와 공유 방식을 환경설정합니다.
이 카메라를 렌더링하려는 노드는 ICVFXCameraA에 해당하는 Node_CamA입니다. ICVFXCameraB를 환경설정하려면 대신 Node_CamB를 선택합니다.
미디어 출력 타입(MediaOutput type)을 Nvidia Rivermax 출력(Nvidia Rivermax Output)으로 환경설정하여 ST 2110을 사용하여 공유합니다. 여기서 다음과 같은 몇 가지 세팅이 중요합니다.
정렬 모드(Alignment Mode)를 프레임 생성(Frame Creation)으로 설정합니다. 이렇게 하면 출력은 렌더링된 프러스텀이 사용 가능해지는 즉시 스트리밍을 시작하며, 항상 환경설정된 스트림의 프레임 간격을 준수합니다.
프레임 잠금(Frame Locking) 모드를 예약 시 차단(Block On Reservation)으로 설정하여 렌더링되는 모든 프레임을 공유하도록 합니다.
프레임 카운터 타임스탬핑 수행(DoFrameCounterTimestamp)을 활성화합니다. 이렇게 하면 언리얼 엔진의 프레임 번호가 비디오 스트림에 임베드되고, 수신 노드에서 이 프레임 번호를 통해 어떤 샘플이 어떤 프레임에 해당하는지 알 수 있게 됩니다.
UE에서는 캡처된 프러스텀 크기를 자동으로 탐지하므로 해상도(Resolution)를 적용할 필요가 없습니다.
프레임 레이트(Frame Rate)는 중요합니다. SDI와 같은 2110 표준은 전체 프레임 간격에 걸쳐 비디오 프레임을 전송합니다. 2110 비디오 스트림을 24fps로 환경설정하면 리스너가 각 프레임을 완전히 수신하는 데 41ms가 소요됩니다. 지연시간을 최소화하려면 네트워크 카드의 가용 대역폭에 따라 프레임 레이트를 클러스터가 나타내는 프레임 레이트보다 더 빠르게 환경설정합니다. 즉, 24fps에서 실행되는 클러스터의 경우 내부 프러스텀을 이 프레임 레이트보다 더 빠르게 스트리밍해야 합니다. 48, 60 또는 좀 더 빠른 프레임 레이트를 사용하는 것이 좋지만 대역폭 사용량을 고려하세요.
인터페이스 주소(Interface Address)의 경우 와일드카드를 사용하여 서로 다른 IP의 다양한 머신에서 작동할 수 있도록 최대한 유연하게 환경설정합니다.
스트림 주소(Stream Address)의 경우 고유한 멀티캐스트 주소를 선택하여 두 내부 프러스텀이 동일한 주소에 스트리밍되지 않도록 합니다. 이렇게 되면 리스너가 둘 간을 구분할 수 없게 됩니다. 여기에 표시된 예제에서 CameraA는 225.1.1.10을 사용하며 CameraB는 225.1.1.11을 사용합니다.
이 스트림은 월로 이동하지 않으므로 이 경우에는 캡처 동기화(Capture Synchronization)가 필요하지 않습니다.
출력 환경설정은 다음 이미지와 비슷한 모습일 것입니다.
미디어 환경설정 – ICVFX 카메라 A 입력
ICVFXCameraA 렌더의 출력 측이 환경설정되었으므로 이제 수신 측에 대해 작업할 수 있습니다. 이번에는 공유 렌더를 수신할 노드와 수신 방법을 환경설정합니다.
먼저 미디어 입력 그룹(Media Input Group)을 추가합니다.
이 출력을 수신할 클러스터 노드(Cluster Nodes)를 추가합니다. 이 경우 월을 구동하는 모든 노드(Node_1, Node_2, Node_3)가 필요합니다.
ST 2110을 사용하여 공유 렌더를 수신하려면 미디어 소스(Media Source)를 Rivermax 미디어 소스(Rivermax Media Source)로 환경설정합니다. 지연시간이 짧은 프레임 잠금이 작동하려면 일부 세팅을 올바르게 구성해야 합니다.
플레이어 모드(Player Mode)에 프레임 잠금(Framelock)을 사용하여 리시버가 렌더마다 예상 프레임을 대기하도록 합니다. 임베드된 프레임 번호를 사용하면 UE의 수신 인스턴스는 현재 프레임 번호와 일치하는 비디오 샘플을 찾을 수 있습니다. 프레임이 아직 도착하지 않은 경우 수신 인스턴스는 프레임이 도착할 것으로 예상하고 기다립니다.
제로 지연시간 사용(Use Zero Latency) 옵션을 사용하여 리시버 UE 인스턴스가 추가 지연시간 없이 현재 프레임 번호와 일치하는 프레임 번호를 기다리도록 할 수 있습니다. 콘텐츠에 따라, 이러한 결과를 얻지 못할 수도 있으므로 지연시간 프레임을 추가하여 내부 대기 시간을 더 확보하는 옵션이 있습니다.
해상도는 스트림이 수신될 때 리시버 UE 인스턴스에서 자동으로 탐지되므로 적용할 필요가 없습니다.
출력에 사용한 것과 동일한 레이트로 프레임 레이트를 환경설정합니다.
인터페이스 주소(Interface Address)의 경우 클러스터의 여러 노드에서 사용되고 동일한 인터페이스 IP를 갖지 않을 것이므로 여기서도 와일드카드를 사용합니다.
출력 환경설정과 일치하도록 스트림 주소 및 포트(Port)를 환경설정합니다.
GPU Direct를 활성화할 수 있지만, GPU와 DPU(Mellanox 카드)가 동일한 루트 컴플렉스에 있는지 확인해야 합니다. 그렇지 않은 경우, 2110 패킷이 손실될 수 있으며 여러 입력 스트림이 있는 경우에는 특히 그렇습니다.
입력에 GPU Direct를 완전히 활성화하려면 언리얼 엔진 스타트업 시 또는 Rivermax 스트림을 시작하기 전에
Rivermax.GPUDirectInput=1을 설정하세요.
입력 환경설정은 다음 이미지와 비슷한 모습일 것입니다.
이제 하나의 렌더 노드에서 클러스터로 ICVFXCameraA가 공유하도록 환경설정됩니다. 미디어 세팅은 다음과 같은 모습일 것입니다.
미디어 환경설정 – ICVFX 카메라 B
ICVFXCameraA 환경설정이 완료되면 다음 세부 사항만 제외하고는 거의 동일한 세팅으로 ICVFXCameraB를 환경설정할 수 있습니다.
미디어 출력 그룹
ICVFXCameraB를 렌더링하는 클러스터 노드는 Node_CamB입니다.
스트림 주소는 달라야 합니다. 225.1.1.11을 사용하되, 동일한 포트 번호를 유지합니다.
미디어 입력 그룹
스트림 주소 세팅만 해당 출력 환경설정과 일치하도록 변경하면 됩니다. 이 예제의 경우 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 영역은 LED 월로 렌더를 전송하는 방식에 대한 것입니다. GPU에서 스트림을 전송하는 대신, 이제 네트워크 카드에서 직접 ST 2110 스트림을 전송할 수 있습니다. 각 노드에 공통 PTP 시간 레퍼런스를 제공하여 동기화 카드에 의존하지 않고도 월로 이동하는 각 스트림을 프레임 잠금 처리하고 동기화할 수 있습니다.
이를 위해서는 다음이 필요합니다.
PTP를 생성하는 마스터 클럭
ST 2110 스트림을 지원하는 스위치
ConnectX-6 BlueField-2 카드와 같은 호환되는 Nvidia 네트워크 카드
LED 프로세서도 ST 2110 스트림을 수신할 수 있어야 함
이러한 방식으로 환경설정하면 모든 노드가 헤드리스 또는 오프스크린으로 환경설정됩니다. GPU를 사용하여 스트리밍하지 않으므로 더 이상 모자이크 환경설정이나 EDID 세팅 처리가 필요하지 않습니다. 그렇지만 각 노드로 이동하는 PTP 시간 레퍼런스는 항상 유효해야 합니다.
이 환경설정이 작동하려면 디플로이 단계에 언급된 PTP 구성에 대한 선택적 섹션을 반드시 진행해야 합니다.
환경설정 기본 사항
nDisplay 환경설정에서 이 기능이 ICVFX 카메라 스트리밍의 환경설정 방식을 바꾸지는 않습니다. 대신 이 기능은 노드 레벨에서 설정할 수 있는 미디어 출력 환경설정을 활용하여 지정된 노드에서 렌더링된 최종 백버퍼를 스트리밍합니다. 프레임 잠금도 환경설정해야 합니다.
각 노드의 창 크기를 환경설정할 때 스트림을 수신하는 LED 프로세서에 따라 이에 대한 컨스트레인트가 있을 수도 있습니다. 동일한 프로세서가 두 개의 스트림을 수신하는 경우 각 스트림 크기를 동일하게 설정해야 할 수 있습니다. 다음은 앞에서 설명된 동일한 예제 클러스터에 대해 이러한 컨스트레인트를 적용하는 방법입니다.
이 예제에서는 세 개의 노드 스트림 Node_1, Node_2, Node_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을 사용합니다.
헤드리스 렌더링 세팅을 활성화하여 두 노드를 오프스크린으로 설정하고 전체화면(Fullscreen) 세팅을 비활성화합니다.
이 변경을 통해 Node_2 스트림의 치수와 일치하도록 Node_1 스트림에 픽셀이 더 추가되었습니다. 뷰포트가 모두 동일하지 않을 때는 노드별 구성 방식을 고려하여 대역폭 낭비를 최소화하는 것이 중요합니다.
이제 각 노드의 미디어 출력을 환경설정합니다. 미디어는 노드 레벨(최종 백버퍼) 및 뷰포트 레벨에서 환경설정할 수 있습니다. 최종 합성 및 워핑된 결과를 보내려면 노드에서 이 환경설정을 수행하는 것이 중요합니다.
Node_1을 선택하고 해당 미디어(Media) 섹션을 찾습니다.
미디어(Media) 환경설정을 활성화합니다.
미디어 출력(Media Output)을 추가합니다.
미디어 출력을 NVIDIA Rivermax 출력(NVIDIA Rivermax Output)으로 환경설정하고 그에 따라 세팅을 환경설정합니다.
정렬 모드(Alignment Mode): AlignmentPoint. 출력을 알려진 정렬 포인트에서 전송해야 하므로 PTP 시간 레퍼런스를 사용하여 출력을 젠록으로 정렬해야 합니다.
연속 출력 수행(Do Continuous Output): True 프레임이 제시간에 렌더링되지 않으면 출력은 계속 진행되며 이전 프레임을 반복해야 합니다.
프레임 잠금 모드(Frame Locking Mode): 예약 시 차단(Block on Reservation). 렌더링된 모든 프레임을 스트리밍할 수 있습니다.
프레젠테이션 큐 크기(Presentation Queue Size): 2. 지연시간을 최소화하려면 이중 버퍼링이 이상적입니다.
텍스처 버퍼 수(Number of Texture Buffers): 3. 이에 대한 엄격한 요구 사항은 없습니다.
해상도(Resolution): 선택 취소(Unchecked). 해상도는 적용할 필요가 없습니다. 체크하지 않으면 노드의 백버퍼 크기를 사용하여 스트림이 생성됩니다.
프레임 레이트(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을 사용합니다. 멀티캐스트 주소만 변경됩니다.
GPUDirect 사용(Use GPUDirect): FALSE. 프레임 잠금 ST 2110 출력에는 현재 지원되지 않습니다.
Rivermax(PTP)를 사용하도록 캡처 동기화(Capture Synchronization)를 환경설정합니다. 이렇게 하면 전체 클러스터에 공통 PTP 시간 레퍼런스를 활용하는 이더넷 동기화 배리어를 사용하여 클러스터 전체에 프레임 잠금을 적용하는 메커니즘이 활성화됩니다.
마진(Margin) (ms): 5. 디폴트 값을 사용합니다. 프레젠테이션을 위해 프레임을 큐에 등록하기 직전에 노드가 캡처 동기화 배리어에 진입하려고 할 때 레퍼런스하는 여유 시간입니다. 마진을 통해 다음 정렬 포인트에 너무 가까운 것으로 탐지되면 배리어 진입이 지연됩니다.
배리어 타임아웃(Barrier Timeout) (ms): 3000. 디폴트 값을 사용합니다. 타임아웃 기간이 끝나기 전에 모든 노드가 조인되지는 않은 경우 배리어에서 나갈 타임아웃입니다.
이제 Node_1 환경설정이 완료되었으며 해당 세팅은 다음과 같은 모습일 것입니다.
이제 Node_1 환경설정이 완료되었으므로 Node_2를 계속 환경설정합니다. 해당 환경설정은 고유해야 하는 스트림 주소를 제외하고 Node_1의 환경설정과 동일해야 합니다.
Node_2 세팅을 Node_1과 동일하게 환경설정합니다.
Node_2 스트림 주소를 225.1.2.2로 설정합니다.
다음은 Node_2의 최종 환경설정입니다.
노드 환경설정 - Node_3
계속해서 Node_3을 환경설정합니다. 위에 설명된 원래 예제에서는 두 뷰포트 간에 간격이 있었습니다.
간격을 없애도록 뷰포트를 환경설정하여 낭비되는 공간을 줄일 수 있습니다.
그런 후 Node_1 및 Node_2에 대해 수행한 것처럼 이 노드를 헤드리스로 환경설정하고, 창 크기를 두 뷰포트를 포함하는 데 필요한 최소 크기로 조정합니다.
7680x2160을 사용하는 대신, 창 크기(Window Size)를 6336x1408로 설정합니다.
헤드리스 렌더링을 활성화합니다.
다음으로, Node_3 미디어 출력을 환경설정합니다. 마찬가지로, 클러스터에서 고유해야 하는 스트림 주소를 제외하고는 세팅은 Node_1 및 Node_2와 동일합니다.
Node_3 세팅을 Node_1 및 Node_2와 동일하게 환경설정합니다.
Node_3 스트림 주소를 225.1.2.3으로 설정합니다.
이 환경설정이 완료되면 이제 클러스터는 다음 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의 최종 환경설정입니다.