This page has been translated automatically.
Video Tutorials
Interface
Essentials
Advanced
How To
UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Working With Projects
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Lighting
Landscape Tool
Sandworm
Using Editor Tools for Specific Tasks
Extending Editor Functionality
Built-in Node Types
Nodes
Objects
Effects
Decals
Light Sources
Geodetics
World Nodes
Sound Objects
Pathfinding Objects
Players
Programming
Fundamentals
Setting Up Development Environment
Usage Examples
C++
C#
UnigineScript
UUSL (Unified UNIGINE Shader Language)
Plugins
File Formats
Rebuilding the Engine Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Content Creation
Content Optimization
Materials
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials
Warning! This version of documentation is OUTDATED, as it describes an older SDK version! Please switch to the documentation for the latest SDK version.
Warning! This version of documentation describes an old SDK version which is no longer supported! Please upgrade to the latest SDK version.

3-Monitor Output with AppSurround Plugin

Warning
The functionality described in this article is not available in the Community SDK edition.
You should upgrade to Sim SDK edition to use it.

AppSurround is designed to span the UNIGINE-based project across three monitors. It allows expanding the borders of the virtual world while keeping the full control over the rendered viewports.

Notice
This plugin cannot be used in a Qt-based application.

Hardware Requirements#

Both hardware requirements should be met to launch AppSurround:

  1. At least 3 video simultaneous outputs on a one video card or NVIDIA SLI system.
  2. AMD Radeon HD 6000 Series or NVIDIA GeForce 600 Series GPU.

See Also#

Launching AppSurround#

AppSurround can be rendered both in the windowed and in the full screen mode.

AppSurround on three monitors

AppSurround output onto three monitors

Launch the application together with a plugin library (lib/AppSurround_*) with the usually required start-up arguments (such as rendering API, window size, etc.).

Shell commands
main_x64 -extern_plugin AppSurround

You can use 64-bit debug or release versions of the library. (The engine automatically loads the appropriate version of the library depending on the specified main application.)

Notice

It is not possible to use AppSurround with:

Customizing AppSurround#

AppSurround can be customized to support any custom viewing frustums (symmetric or asymmetric ones) when rendering onto three monitors.

Notice
To prevent modifying camera settings from system script, specify the -extern_define "PROJECTION_USER" definition in the project's launcher.

AppSurround Cameras#

AppSurround has one primary viewport in the center, while all others are rendered as auxiliary ones. By default, the primary display is the UNIGINE engine viewport used for one-monitor configuration. It uses matrices of the Player used by the engine to view the scene. Other displays are arbitrary cameras with any perspective and facing whatever direction needed. Each display has its own modelview and projection matrices. Both the primary monitor and auxiliary ones can be enabled or disabled, if necessary.

  • The central monitor is a primary one. Two side monitors are auxiliary monitors that can be arbitrary cameras with any perspective and facing whatever direction needed.
  • Each display, including the primary one, has its own modelview and projection matrices.
  • By default, only a primary one has an interface (render system GUI, editor widgets, wireframe, or the profiler). However, separate GUIs can be drawn on all monitors.
  • All viewports have their own viewport and Reflection mask to selectively render nodes and reflections from them.

How to Customize Cameras Configuration#

Just like in case with AppWall, rendering of AppSurround viewports is controlled by the wall.h script (found in <UnigineSDK>/data/core/scripts/system).

To implement a custom camera configuration, comment wall.h out in the unigine.usc system script and wrap your custom code around with #ifdef HAS_APP_SURROUND ... #endif in the render() function of the system script:

Source code (UnigineScript)
int render() {
	#ifdef HAS_APP_SURROUND
		// place an implementation of a 
		// custom camera configuration here
		// ...
	#endif
	return 1;
}

There are two possible setups depending on how the central monitor is rendered. It can be drawn by:

  • The default engine renderer (the same as when a usual one-monitor application is rendered).
  • The AppSurround renderer itself (which is safer if you are going to use asymmetric frustum for the central monitor and modify its modelview matrix).
Notice
Only one of two renderers should be enabled at the same time.

The following example demonstrates how to tweak cameras configuration and choose the renderer for the central monitor.

1. Using default engine renderer#

The first variant is to render the central (primary) monitor by the default engine renderer.

  1. Enable two side (auxiliary) monitors via engine.surround.setEnabled(). All AppSurround monitors are disabled by default. The central one should be disabled, as it is drawn by the default engine renderer.

    Source code (UnigineScript)
    // Enable the 1-st and the 3-rd monitors.
    // The third argument of the function sets the "enabled" flag.
    engine.surround.setEnabled(0,1);
    engine.surround.setEnabled(2,1);
  2. Set projection and modelview matrices for side monitors via engine.surround.setProjection() and engine.surround.setModelview().

    Source code (UnigineScript)
    // Settings for the 1-st monitor
    engine.surround.setProjection(0,projection_0);
    engine.surround.setModelview(0,modelview_0);
    
    // Settings for the 3-rd monitor
    engine.surround.setProjection(2,projection_1);
    engine.surround.setModelview(2,modelview_1);

2. Using AppSurround renderer#

Another variant is to render the central monitor by the AppSurround renderer. This variant can be used, for example, if you want to set up symmetric frustums for all monitors.

  1. Disable rendering into the default UNIGINE viewport via engine.render.setEnabled():

    Source code (UnigineScript)
    engine.render.setEnabled(0);
  2. Enable all three AppSurround monitors including the primary one. As a result, all three viewports will be rendered by AppSurround renderer itself:

    Source code (UnigineScript)
    // Enable all three monitors:
    engine.surround.setEnabled(0,1);
    engine.surround.setEnabled(1,1);
    engine.surround.setEnabled(2,1);
  3. Set modelview and projection matrices for all three monitors.

    Source code (UnigineScript)
    // Settings for the 1-st monitor
    engine.surround.setProjection(0,projection_0);
    engine.surround.setModelview(0,modelview_0);
    
    // Settings for the 2-nd (primary) monitor
    engine.surround.setProjection(1,projection_1);
    engine.surround.setModelview(1,modelview_1);
    
    // Settings for the 3-rd monitor
    engine.surround.setProjection(2,projection_2);
    engine.surround.setModelview(2,modelview_2);
Last update: 2021-12-13
Build: ()