# Unity3D

> [**Download the plugin here from the Unity asset store**](https://assetstore.unity.com/packages/tools/integration/multi-projection-integration-for-blending-and-warping-166403)

{% embed url="<https://youtu.be/CA9n_h80oxk>" %}

The plugin allows you to integrate your display calibration directly into a Unity Application.

Follow the steps below on how to use it:

## In VIOSO <a href="#id-1939937632-m87a6w" id="id-1939937632-m87a6w"></a>

Perform a calibration with VIOSO or Anyblend VR\&SIM or VIOSO Integrate plus either in [2D](https://docs.vioso.com/calibration/content-mapping/2d-warp) (for static warping & single viewport) or [3D](https://docs.vioso.com/calibration/content-mapping/3d-mapping) (model based for dynamic warping & multi-viewports)

You can use [project mode](https://docs.vioso.com/start/project-mode) with the Unity template or [free mode](https://docs.vioso.com/start/free-mode).

Next, export your mapping in the VWF format:

* From the menu bar, go to **File > Export Mapping**
* Select the **VWF format**.
* if applicable check the “**3D**” box .
* Choose a file name and path.
* Click on **Export**.

## In Unity3D (SRP) <a href="#id-70199083-bzznwv" id="id-70199083-bzznwv"></a>

1. Open your Unity Project.
2. [Download](https://assetstore.unity.com/packages/tools/integration/multi-projection-integration-for-blending-and-warping-166403) and import “**Multi-Projection Integration for Warping and Blending**” asset to your project.\
   ![](https://helpdesk.vioso.com/wp-content/uploads/2020/04/unity1.png)

   Click on “**Import**“
3. Navigate to the plugin directory “**Assets\Plugins\vioso**” and add your mapping file (`.vwf`) to that folder.
4. Add `VIOSOcamera.cs` script to each of your Camera Objects (`Assets\Plugins\vioso\VIOSOcamera.cs`)<br>

   > (!) The cameras for uncalibrated displays (such as a monitor, secondary displays..etc) should not contain the script, as they will not have any warp and blend.

   ![](https://helpdesk.vioso.com/wp-content/uploads/2020/04/unity2.png)
5. `VIOSOWarpBlend.ini` Configuration:\
   Open `Assets\Plugins\vioso\VIOSOWarpBlend.ini`Add the parameters for your cameras as shown below:

```ini
[default]

logLevel=2

base=[1000, 0, 0, 0; 0, 1000, 0, 0; 0, 0, -1000, 0; 0, 0, 0, 1]
eye=[0,0,0]
near=0.15000 ;the near plane clipping distance
far=10000.00000 ;the near plane clipping distance


bAutoView=1;
autoViewC=1.00000 ;
bTurnWithView=1
bBicubic=1
bDoNoBlack=0


;Path for the calibration file exported from VIOSO. Absolute or relative to the .dll path
calibFile=Export.vwf

;Camera name in Unity
[cam1]
calibIndex=2

[cam2]
calibIndex=1

[cam3]
;optionally you can assign here a different calibration file. e,g calibFile=export_2.vwf
calibIndex=0
```

* `calibFile=`:  Name of .VWF file(s).
* `name`: Name of the **Camera GameObject** in Unity.
* `CalibIndex`: Assign the Index of the mapping inside the vwf (0,1,2..).

> Full list of .ini file parameters: [Broken link](https://docs.vioso.com/integration/real-time-engines/broken-reference "mention")

Example of additional parameters:

* Add your **Pivot Point** coordinates for a moving platform by editing the highlighted X,Y,Z parameters of the **base** matrix as shown below:
  * `Base = [1000, 0, 0,0; 0, 1000, 0, 0; 0, 0,  -1000, 0; X, Y, Z, 1]`
  * `(X,Y,Z)=(0,0,0)` being the center of the projection screen.
* Enable Dynamic Eyepoint by setting `eyePointProviderParam` to listen to a specific port using UDP protocol (i.e = port 999)

6\. The Integration is now complete. You can preview it by running the player and switching between displays (see note 2 below). If everything looks good, **Build** your project.

7\. Copy the `vioso3d.vwf` and `VIOSOWarpBlend.ini` files from Unity **Assets/plugin/vioso** to folder **\[your\_build\_path..]/\_data/plugin/** next to `ViosoWarpBlend.dll`.

8\. Launch your application and you should see your calibration active on the displays.

### In Unity3D (HDRP/URP) <a href="#id-111003634-irev72" id="id-111003634-irev72"></a>

Download the package from our Github and follow the instructions in the Readme.md

> **– HDRP**: <https://github.com/vioso/Unity_HDRP_plugin>
>
> **– URP**: <https://github.com/vioso/Unity_URP_Plugin>

### Notes / Troubleshooting <a href="#id-1473209732-xcwx0e" id="id-1473209732-xcwx0e"></a>

1. **Demo project:** download a demo with a sample VWF calibration file here: [(Panadome Sandbox – VIOSO office)](https://github.com/Ahmed-jerbi/VIOSO-Unity-Sandbox)
2. Make sure you activate multi-display support in your Unity Application.\
   Unity’s default display mode is one monitor only. When you run your application, you need to use `Display.Activate()` to explicitly activate additional displays.\
   Follow the Unity Manual <https://docs.unity3d.com/Manual/MultiDisplay.html>
3. The multi-display feature of Unity only runs in the built standalone application.\
   However, you can **preview your displays** in the Editor by running the project (**Play** button), then navigating through displays in the **Game tab** to see the different calibrated outputs:\
   ![](https://helpdesk.vioso.com/wp-content/uploads/2020/04/unity3.png)
4. Unity’s multi-display system can enable only a maximum of **8 displays.** Digital display compounds (Nvidia Mosaic, Surround, Eyefinity, Datapath..etc) can be used as a workaround to this limitation. You must then use single perspective 2D mappings or develop your own split screen method (see 4.)
5. Unity renders by default a single camera per display, if you need to have multiple warped perspectives on a single display, you must configure split screen outputs for your project, for example using a render texture for each camera, find [here a demo](https://github.com/Ahmed-jerbi/Digital-MultiDisplay-Compound-PostFX).
6. **Cameras not displaying in the correct display order:**
   1. 1st fix: From the Unity camera parameters, change the “Target display” to match the “Windows Display Settings” order.
   2. 2nd fix: From the VIOSOWarpBlend.ini change the “calibIndex” between cameras to swap the order.
7. **Color space:** The VIOSO plugin blending shader uses the **Gamma** color space, so make sure your project is not set to **Linear.** `Project Settings > select the Player category > Other Settings > Rendering`
8. **Stacking other post-processing effects:** Our post-process is usually applied last in the chain, so it will warp and blend on top of other effects. Just make sure your effects are supported in multi-display mode and that they synchronize well across cameras.We positively tested several effects such as frustum culling, volumetric lights (Aura) and color grading.
9. **Dynamic Eyepoint:** Enable Dynamic Eyepoint in **VIOSOWarpBlend.ini** by setting **eyePointProviderParam** to listen to a specific port using UDP protocol (i.e = listen 999). The format of the coordinates is the following: `Px Py Pz Rx Ry Rz` where P is the position and is the rotation. For a simple test, you can use **=sinewave** to undulate all axes and angles in a loop, or download our Eye Tracker Simulator [here](https://github.com/Ahmed-jerbi/VIOSO-Unity-Sandbox/tree/master/_Eye%20tracker).
10. You can manually add the following parameters to your cameras in **VIOSOWarpBlend.ini:dir=** \[x,y,z] : Direction.**fov**=\[x,y,z,w] : Field of view. They will be **recalculated** **automatically** and overwritten if **bAutoView = 1**.
11. Make sure you build for `x86_64` Architecture so that the .dll libraries load properly.\
    **File > Build Settings:**\
    ![](https://helpdesk.vioso.com/wp-content/uploads/2020/04/unity8.png)
12. **Log message: `Fatal Error: Failed to load VIOSOWarpBlend`** This occurs when Unity successfully loaded VIOSOPlugin.dll but not VIOSOWarpBlend.dll. A common reason is missing runtime redistributables which can be solved by installing our VIOSO software on the machine.
13. Check `VIOSO_Plugin64.log` in the build directory **\plugin** to monitor the status and errors.
