nDisplay - BASIC 1 computer, 2 monitors

We have one computer with 2 monitors (left and right) that are utilising the same graphics card…

We’re using the nDisplay template project and would like the application to display the viewport across the two monitors when the package is executed.

Would anyone be able to share an example config file demonstrating the basic necessities to get this working? For example, how would the cluster nodes look in the config? Are they even needed seeing as it’s one computer.

On a seperate note, do we even need to run the application through nDisplay Launcher if it’s just one computer running everything?

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"