nDisplay를 적용하기 위해서는 Configuration File을 작성해야함
각각 포함해야 하는 Config 정보
Cluster Node > Window > Viewport > Projection > Screen
1. Cluster Node Configurations
- Cluster는 nDisplay 네트워크에서 하용하는 각각의 언리얼 어플리케이션 인스턴스에 필요한 것
- Window Configuration의 레퍼런스를 지녀야 함
- 어플리케이션 인스턴스를 실행할 컴퓨터에 대한 정보 선언 (hostname, IP주소)
- 여러개의 클러스터 노드에 각각 다른 컴퓨터 배정 가능
- 같은 호스트상에 실행되는 여러개의 클러스터 노드 가능
- master 클러스터는 master=true 선언 필수, sound도 마스터에서만 true 하는 것이 일반적인듯
- GPU 여러개 사용하는 경우 클러스터 별 GPU 배정 가능
2. Window Configurations
- 프로그램 메인 윈도우에 대한 설정 사항 지정 (크기, 창 위치, 전체화면)
- 1개 이상의 Viewport Config 넘겨줘야 함 (윈도우 하나에 여러 뷰포트 넘기기 가능)
- Postprocess Config 여기서 넘겨줄 수 있음, 여러개 넘길시 순서대로 적용
- fullscreen false 지정하면 크기 지정해주어야 함
3. Viewport Configurations
- Window당 그려야할 사각형 공간에 대한 설정
- Projection Config, Camera Config 필수적으로 지정해줘야함
- Offset 지정 해줘야 하는 경우 : 출력 화면 프로젝터가 겹칠 경우, 하나의 윈도우에 여러개의 뷰포트를 각각 다른 위치에 그려야 하는 경우
- Buffer Ratio : 최종 출력 화면 렌더 타겟의 해상도 조절
- 0.0~1.0 사이의 값, 1.0이 가장 많은 사양을 요구함(최고품질)
- 유튜브 튜토리얼에서는 0.8을 가장 추천하였음, 프로젝션 컴퓨터의 사양에 따라 조절
- 사용할 GPU 사용 가능, default 값은 0번째 GPU
- 다른 어플리케이션에 텍스쳐를 전송해야 할 시 share 옵션으로 Texture Sharing 켜야함
4. Projection Configurations
- Viewport Config에서 이거 하나씩 지정해야함
- 일반적으로 simple projection type 사용
- mpcdi, easyblend, vioso, domeprojection 타입이 있는데 이건 함께 사용하는 소프트웨어에 따라 지정해주는것으로 보임
- 이 다른 타입들은 곡면에 프로젝션 할때 이미지 왜곡하거나 변형시켜줘야 할 때 사용함
- Projection Blend는 겹치는 부분에 대한 처리를 의미하는것으로 보임
- MPCDI는 Multiple Projection Common Data Interchange의 약자 (뭔가 공연장에서 쓰이는듯)
- 우리의 경우에는 그냥 simple projection을 사용하도록 하자
- [projection] id=proj_simple_LT type=simple screen=scr_LT
- scr_LT라는 screen config에서 정의된 절두체 사용시 simple projection의 예시 선언
- 아무런 왜곡도 변형도 없이 그냥 그리는 방법임
- simple projection 사용하면 screen config 무조건 지정해줘야 함
5. Screen Configurations
- simple projection 타입으로 그릴때 사용할 절두체에 대한 정보 정의
- 절두체의 각 면을 screen config으로 정의해줘야함
- 화면 피봇 포인트는 절두체의 중점
- 오브젝트 부모로 사용할 Scene Node Config 여기에서 지정
- 이거 지정하면 loc, rot 파라미터 부모에게 relative됨
- VR tracker도 여기에서 지정해줘야함
6. PostProcess Configurations
- Unreal Engine Instance Window에다가 포스트 프로세싱 어떻게 먹일지
- OutputRemap, TextureShare 두가지를 지원
- OutputRemap : uv 매핑된 obj파일 지정해주면 그거에 맞게 nDispay로 생성된 화면을 변형시켜줌
- TextureShare : 다른 프로그램에서 텍스쳐 받아서 특정 뷰포트에 그릴 수 있음
7. Camera Configurations
- 클러스터들은 모두 같은 지점에서의 장면을 그림 > 이 지점에서 각각의 장면으로의 뷰포인트 정의 해주는 부분
- 런타임 시 이 뷰포트들 끼리 바꿔치기 가능
- 뷰포인트 VR Tracker로부터 받아올 수 있도록 설정 가능
- loc, rot으로 부모로부터의 offset 지정 가능한 것으로 보임 (직접 해보자)
8. Scene Node Configurations
- 3D에서 변환 하나하나를 내포하는 씬 노드 hierarchy 정의
- 다른 Configuration 파일에서 정의한 3D상에서 회전 이동 하는 모든 것들 (카메라, 스크린)의 부모로 사용 가능
- 각각 요소들 간의 공간적 관계성 표현
- 얘도 VR 트래킹으로 할 수 있음 (카메라 처럼)
- [scene_node] id=vr_space_root loc="X=0.Y=0,Z=0" rot="P=0,Y=0,R=0"
[scene_node] id=walls_front_group loc="X=2.Y=0,Z=0" rot="P=0,Y=0,R=0" parent= vr_space_root
- child node가 2 미터씩 오프셋 가지게 하는 예시


- Unreal Engine Input System에 이벤트 넘길 디바이스, 블루프린트에 input event 실행할 디바이스 정의
- Input Setup Configuration 연결 할 수 있음
- [input] id=ControlKeyboard type=keyboard addr=Keyboard0@192.168.0.1 reflect=ue4
- 키보드 연결 예시
- type : tracker (VR tracker), analog (Axis), button (boolean), keyboard
- addr Format : DEVICENAME@SERVER_ADDRESS:SERVER_PORT
- VRPN 서버 주소, VRPN 서버 리슨 포트 (지정 안할시 3883)
- nDisplay 블루프린트 input node에 채널이나 키 바인딩할 수 있음
- [input_setup] id=keyboard0 key=Space bind="nDisplay Button 3"
- 키보드 바인딩 예시
11. General Configurations
- Optional으로 나와있음, 클러스터 전반적인 구동에 관한 옵션 지정
- swap sync policy : 결과 동기화 방식 (대체로 1 사용하는것으로 보임, Default 0)
- 0: no synchronization (VSync=0)
- 1: Software swap synchronization (VSync=1)
- 2: NVIDIA swap lock (only for NVIDIA cards rendering with DirectX11 and DirectX12)
- ue4 input sync policy : 언리얼 입력을 nDisplay에 replicate 하는 방식 (Default 1)
- 0: Native UE4 input is processed only by the primary node. No replication is done to other cluster nodes
- 1: All native input that the primary node receives is replicated to all other cluster nodes as well
12. 그 외
- Network Configuration : Timeout 설정 가능
- Info Configuration : nDisplay와 언리얼 엔진과 호환 가능한 버전 지정
- 이거 손으로 하지 말래 nDisplay 런처가 자동으로 지정해줌
- Custom Configuration Parameters : 클러스터 노드에게 배정할 key-value pair 지정 가능
- 블프나 C++에서 런타임 시 필요하면 받아올 수 있는 식별 값 지정하는 것으로 보임