Attached as a code block below. This is for running two 4k monitors on the same machine, with once camera view rotated 90degrees. I turned off SwapSync in the config file due to poor ( ~10fps ) performance running UE4 on multiple monitors with either of the two sync modes turned on.
The nDisplay Launcher setup is required for doing “multi-view” setups as far as I know.
#####################################################################
# nDisplay demo config file
#
# This file demonstrates how to use multiple viewports configurations.
# Here is a cluster of 4 nodes with individual viewports assigned.
#
#####################################################################
#####################################################################
# Config info
#********************************************************************
# Config file header.
#
# Properties:
# version - Specifies the version of the configuration file (UE4.xx)
#********************************************************************
[info] version="23"
#####################################################################
# Cluster nodes
#********************************************************************
# Cluster node is an application instance. It's allowed to use
# multiple instances on the same PC. Sometimes its necessary. Usually
# application instances run on separate machines.
#
# Properties:
# id - Unique node name
# addr - Network address (IPv4 only)
# window - Window ID
#
# Optional properties:
# master - Specifies if current node is master; default is 'false'
# port_cs - Cluster Synchronization port (used by master node only); default is 41001.
# port_ss - Swap Synchronization port (used by master node only); default is 41002.
# port_ce - Cluster Events port (used by master node only); default is 41003.
# sound - turns on/off sound for this application instance; default is 'false'
#********************************************************************
[cluster_node] id="node_LT" addr="127.0.0.1" window="wnd_LT" sound="true" master="true" sound="true"
[cluster_node] id="node_LB" addr="127.0.0.1" window="wnd_LB" sound="false"
# [cluster_node] id="node_RT" addr="127.0.0.1" window="wnd_RT" sound="false"
#####################################################################
# Application windows
#********************************************************************
# The window entity defines properties of the application's game window.
#
# Properties:
# id - Unique window name
# viewports - Array of viewports
#
# Optional properties:
# fullscreen - Fullscreen or windowed mode; default is false - windowed
# winx - X location
# winy - Y location
# resx - Width
# resy - Height
#********************************************************************
#[window] id="wnd_LT" fullscreen="false" WinX="0" WinY="700" ResX="640" ResY="480" viewports="vp_LT"
#[window] id="wnd_LB" fullscreen="false" WinX="642" WinY="700" ResX="640" ResY="480" viewports="vp_LB"
#[window] id="wnd_RT" fullscreen="false" WinX="1282" WinY="700" ResX="640" ResY="480" viewports="vp_RT"
[window] id="wnd_LT" fullscreen="false" WinX="0" WinY="0" ResX="3840" ResY="2160" viewports="vp_LT"
[window] id="wnd_LB" fullscreen="false" WinX="3840" WinY="0" ResX="3840" ResY="2160" viewports="vp_LB"
# [window] id="wnd_RT" fullscreen="false" WinX="7680" WinY="0" ResX="3840" ResY="2160" viewports="vp_RT"
#####################################################################
# Viewports
#********************************************************************
# Viewport is a rectangle area of game window where a frame is mapped.
# Usually viewports start at 0:0 and have the same size as its parent
# window (single viewport rendering). However, in some cases multiple
# viewports required.
#
# Properties:
# id - Unique viewport name
# x - X coordinate of viewport's top left corner on a window
# y - Y coordinate of viewport's top left corner on a window
# width - Width of viewport in pixels
# height - Height of viewport in pixels
#
# Optional properties:
# camera - Cammera assigned to this viewport
#********************************************************************
#[viewport] id="vp_LT" x="0" y="0" width="640" height="480" projection="proj_simple_LT"
#[viewport] id="vp_LB" x="0" y="0" width="640" height="480" projection="proj_simple_LB"
#[viewport] id="vp_RT" x="0" y="0" width="640" height="480" projection="proj_simple_RT"
[viewport] id="vp_LT" x="0" y="0" width="3840" height="2160" projection="proj_simple_LT"
[viewport] id="vp_LB" x="0" y="0" width="3840" height="2160" projection="proj_simple_LB"
# [viewport] id="vp_RT" x="0" y="0" width="3840" height="2160" projection="proj_simple_RT"
#####################################################################
# Projection policies
#********************************************************************
# Projection policy is an abstraction which knows where to take an
# projection input data and how to compute the output. This means
# that each policy might have it's own properties that it knows how
# to interpret and utilize. There are several projection policies
# available natively: simple, MPCDI and EasyBlend:
#
# * Simple - This one is the native projection policy that can be fully
# configured from the config file. All you need is to specify
# a projection screen. Those who has been used the nDisplay
# before are familiar with this policy already.
#
# * MPCDI - This policy allows to use an industry standard for multi-
# projector setups. It requires a special .mpcdi file that
# contains all the data required for computations.
#
# * EasyBlend - This policy is an implementation of the EasyBLend SDK
# provided by Scalable Display Technologies. It requires
# a bunch of special files that describe a multi-projector
# system.
#
# Properties:
# id - Unique projection policy name
# type - Projection policy type (custom types can be used)
#********************************************************************
# Here is an example of simple projection policy. It requires to
# specify projection screens only. Refer to specific demo configs
# or documentation page to get more info about other projection policies.
[projection] id="proj_simple_LT" type="simple" screen="scr_LT"
[projection] id="proj_simple_LB" type="simple" screen="scr_LB"
# [projection] id="proj_simple_RT" type="simple" screen="scr_RT"
#####################################################################
# Projection screens
#********************************************************************
# Projection screen is a rectangle which determines the camera frustum.
# Usually the projection screen has the same dimensions as an output
# display but in some cases it may differ. Used by simple projection
# policy.
#
# Properties:
# id - unique projection screen name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified. The pivot is a screen's
# center and the values are in meters.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified. The pivot is a screen's
# center and the values are in degrees.
# size - width (X) and height (Y) of the screen. Values are in meters.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
#********************************************************************
[screen] id="scr_LT" loc="X=1,Y=-0.1,Z=0.5" rot="P=0,Y=0,R=0" size="X=2,Y=1.5" parent="screen1"
[screen] id="scr_LB" loc="X=1,Y=-0.1,Z=0.5" rot="P=0,Y=0,R=0" size="X=2,Y=1.5" parent="screen2"
# [screen] id="scr_RT" loc="X=1,Y=-0.1,Z=0.5" rot="P=0,Y=0,R=0" size="X=2,Y=1.5" parent="screen3"
#####################################################################
# Cameras
#********************************************************************
# Camera is a predefined point frome where the stereoscopic view built.
# It's possible to define multiple cameras and swith the active one
# during runtime. You're free to attach any camera to a tracking device
# for head tracking. Consider a camera as a viewer's head.
#
# Properties:
# id - unique camera name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
# eye_swap - Swap eyes for this camera in stereo mode; default is 'false'
# eye_dist - interoccular distance in meters for stereo/force_offset modes.
# Default is 0.064.
# force_offset - Force monoscopic camera to behave like a left/right eye
# of a stereoscopic camera. Eye_offset is applicable in this case.
#********************************************************************
[camera] id="camera_static" loc="X=0,Y=0,Z=0" eye_swap="false" eye_dist="0.064" force_offset="0"
#####################################################################
# Scene nodes (hierarchy transforms)
#********************************************************************
# Scene node is an actor component which is basically a transformation
# matrix. Scene nodes can be helpful to build a component hierarchy, to
# define some special places (like a socket) within VR space.
#
# It might be difficult to understand what VR space origin is. Consider
# it as a point in space where VR space starts. Any componenent listed
# in this config file is relative to its parent or this origin.
#
# Properties:
# id - unique scene node name
# loc - relative location to the parent component. Location is relative
# to the VR root if no parent specified.
# rot - relative rotation to the parent component. Rotation is relative
# to the VR root if no parent specified.
#
# Optional properties:
# parent - ID of parent component in VR hierarchy; default is VR root.
# tracker_id - ID of tracking device; no tracking by default.
# tracker_ch - ID of tracking device's channel; no tracking by default.
#********************************************************************
[scene_node] id="cave_origin" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"
[scene_node] id="screen1" loc="X=0,Y=0,Z=0" rot="P=0,Y=-90,R=0" parent="cave_origin"
[scene_node] id="screen2" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" parent="cave_origin"
# [scene_node] id="screen3" loc="X=0,Y=0,Z=0" rot="P=0,Y=90,R=0" parent="cave_origin"
[scene_node] id="wand" loc="X=0,Y=0,Z=1"
#####################################################################
# General settings
#********************************************************************
# Properties:
# swap_sync_policy - swap synchronization policy
# - 0 - no synchronization
# - 1 - software swap synchronization
# - 2 - NV swap lock (Nvidia cards only, OpenGL only)
[general] swap_sync_policy="0"
#####################################################################
# Network settings
#********************************************************************
# Optional properties:
# cln_conn_tries_amount - how many times a client tries to connect to a server; default is 10
# cln_conn_retry_delay - delay before next client connection try (milliseconds); default is 1000
# game_start_timeout - timeout before all data is loaded and game started (milliseconds); default is 30000
# barrier_wait_timeout - barrier timeout for both game and render threads (milliseconds); default is 5000
[network] cln_conn_tries_amount="10" cln_conn_retry_delay="1000" game_start_timeout="30000" barrier_wait_timeout="5000"
#####################################################################
# Custom arguments
#********************************************************************
# Any custom arguments available in runtime can be specified here.
# Format: ARG_NAME="ARG_VAL"
[custom] SampleArg1="SampleVal1" SampleArg2="SampleVal2"