UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
FAQ
Programming
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and 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
CIGI Client Plugin
Rendering-Related Classes

Occlusion Culling

Object culling allows you not to render objects which are not presented in the viewing frustum. The particular cases of occlusion culling are the following:

Notice
As the object's bounding box is used for occlusion culling (it is checked if the bounding box is visible or not), it is recommended to export objects from 3D computer graphics software in local coordinates to make bounds of the mesh closer to geometry.

Occluders#

Occluders allow culling geometry that isn't visible behind them. There are 3 types of occluders:

The type of occluder to be used is defined by geometry to be culled.

Occluders can be highly effective in case of complex environments where there are many objects that occlude each other and are costly to render (they have a lot of polygons and/or heavy shaders).

Notice
Using occluders to cull large objects with a few surfaces may cause additional performance loss. Moreover, occluders aren't effective in scenes with flat objects, or when a camera looks down on the scene from above. So, when using the occluders, you should take into account peculiarities of objects to be culled.

Before using occluders, check the following:

  • Rendering of occluders is enabled: in the Menu Bar, Rendering -> Occlusion Culling -> Occluders is toggled on.
  • Rendering of shadows from the occluded objects is disabled: in the Menu Bar, choose Windows -> Settings -> Occlusion Culling and toggle Shadows Culling on.
    Notice
    You can leave shadows rendering enabled, if necessary.

Usage of occluders is shown in the Content Optimization video tutorial.

Using a Box-Shaped Occluder#

The occluder is a box shape that culls objects' surfaces, bounds of which aren't visible behind it. This is the simpliest type of occluders that should be used together with box-shaped objects that block off other objects. For example, you can add an occluder the shape of which coincides with the bounds of a building to avoid rendering of objects behind this building.

Box-shaped occluder inside building

To create a box-shaped occluder, perform the following:

  1. In the Menu Bar, choose Create -> Optimization -> Occluder and add the occluder as a child to the node that should occlude other objects.
  2. In the Common section of the Node tab in the Parameters window, set the position of the occluder to the parent one.

  3. In the World Occluder section of the Node tab, click Edit Size to enable the editing mode for the occluder. Resize the occluder by using the colored rectangles on the occluder box sides so that it coincides with the parent node size.
    Notice
    You can also use the Size parameter to set the size along the axes.

  4. Specify the Distance between the camera and the occluder, at which the occluder doesn't occlude anything and, therefore, should be disabled to avoid negative impact on the performance.

To check how the occluder works, disable the parent node and then try to toggle the occluder on and off:

By default, the front faces of the occluder are used to cull objects. However, if the camera is inside the occluder (e.g. inside the building), occlusion culling won't be performed. To avoid such situation, enable the Back Face parameter in the World Occluder section of the Node tab.

Using a Mesh-Based Occluder#

The occluder mesh is based on an arbitrary mesh that culls objects' surfaces, bounds of which aren't visible behind it. The occluder mesh is used together with the geometry that cannot be approximated with a box.

To create a mesh-based occluder, perform the following:

  1. Prepare a low-poly mesh to be used for the occluder.
    Notice
    It isn't recommended to use the same detailed mesh that is used for the node that should occlude other objects: the mesh for the occluder should be as simple as possible to avoid performance loss.

  2. In the Menu Bar, choose Create -> Optimization -> Occluder Mesh and specify the prepared mesh.
    Notice
    You can load a new mesh for the occluder at any time.
  3. Add the occluder as a child to the node that should occlude other objects.
  4. In the Common section of the Node tab in the Parameters window, set the position of the occluder to the parent one.

  5. Specify the Distance between the camera and the occluder, at which the occluder doesn't occlude anything and, therefore, should be disabled to avoid negative impact on the performance.

Using a Terrain Occluder#

The occluder terrain culls objects' surfaces, bounds of which aren't visible behind the terrain geometry. The occluder terrain repeats the shape of the terrain. It is highly effective on scenes containing:

  • A terrain with fluctuating heights.
  • A lot of objects with complex geometry that can be occluded by the terrain geometry. However, such objects shouldn't be too large in order to be successfully culled by the terrain occluder (since if any part of their surface is seen, it cannot be culled).

It is not recommended to use the occluder terrain in the following cases:

  • If the terrain is flat: the occluder will decrease the performance as there would be no surfaces to be culled.
  • If the terrain relief is changed in runtime.
  • If the terrain is observed from above (e.g., in case of flight simulators).
    Notice
    If the camera can go below in such scenarios, set up the occluder terrain that is enabled/disabled at a certain distance to improve the performance.

To create an occluder terrain, perform the following:

  1. In the Menu Bar, choose Create -> Optimization -> Occluder Terrain and place it in the center of the terrain.
  2. In the World Occluder Terrain section of the Node tab, set the Size of the occluder so that it coincides with the the terrain size. The whole terrain should be covered with the occluder.

  3. In the Heights parameter of the World Occluder Terrain section, specify the same height map that was used for the terrain generation, but downscaled for optimization purposes.

Notice
To check if the occluder corresponds to terrain shape, toggle Helpers -> Occluders.

Check the result: look through the terrain geometry to the occluded objects and try to toggle the occluders rendering on/off.

Sectors and Portals#

For large indoor scenes with several rooms and passages, sectors and portals should be used to optimize performance. Sectors and portals allow skipping all objects outside the current interior (e.g., outdoor objects, other rooms, and environments).

Use of sectors and portals is also shown in the Content Optimization video tutorial.

Using Sectors#

A sector allows culling all objects outside its volume. Sectors are used to split the world into two areas: inside and outside the sector. They can significantly improve the performance in complex scenes with large indoor and outdoor parts: when you are inside a room, objects outside this room aren't rendered.

To create and set up a sector, perform the following:

  1. In the Menu Bar, choose Create -> Optimization -> Sector and add the sector to the world.
  2. In the World Sector section of the Node tab, Parameters window, specify the size of the sector, so that it coincides with the room size.

  3. Move the sector to match the position of the room. You can also add the sector node as a child to the room node and set the sector's position to the parent one.

In the result, the interior won't be visible, when the camera is outside the room and vice versa.

Notice
Objects that have the Visibility by Sectors/Portals option toggled off, won't be culled.

Connecting Adjacent Sectors#

A portal allows connecting sectors: it provides an opening through which an interior of one sector is visible from another sector. Portals don't have any positive impact on the performance: they only make the scene more realistic.

To create a portal, perform the following:

  1. In the Menu Bar, choose Create -> Optimization -> Portal and place it on a face of a sector. The portal must become green: it means that the interior of the sector will be visible through the portal.

  2. In the World Portal section of the Node tab, Parameters window, set the Width and the Height of the portal. Also you can adjust the size in the editing mode that is activated by pressing Edit Size.

Hardware Occlusion Queries#

One more option to cull geometry that is not visible in the camera viewport is to use a hardware occlusion query. It allows skipping rendering of objects, the bounding boxes of which are covered by another solid geometry. As a result, the number of rendered polygons is reduced and the performance grows.

To run the hardware occlusion test for the scene before sending data to the GPU, toggle the Rendering -> Occlusion Culling -> Occlusion Query flag on in the Menu Bar.

Notice
Culling will be performed for all objects with the Culled by Occlusion Query flag set in the Node tab of the Parameters window.

To run the hardware occlusion test, perform the following:

  1. In the Menu Bar, toggle the Rendering -> Occlusion Culling -> Occlusion Query flag on to enable testing for the scene before sending data to the GPU.

  2. For all objects, that should be culled, enable the Culled by Occlusion Query flag in the Node tab of the Parameters window.
    Notice
    Only nodes with this flag set are tested on the hardware occlusion culling.

When culling is enabled for the object, an occlusion query box is rendered for it.

Material ball and its occlusion query box

Notice
To visualize such boxes, toggle the Helpers -> Occlusion Queries option on.
The occlusion query box coincides with the size of the object's bounding box. When this box is overlapped (i.e. it isn't in the camera viewport), it is highlighted red, which means the occlusion test is not passed and the mesh will not be drawn.
Occlusion query test passed
Occlusion query test failed, material ball isn't rendered

Notice
Hardware occlusion queries should be used only for objects that use heavy shaders. Otherwise, performance will decrease instead of increasing. It is recommended to enable queries for water or objects with reflections.

You can check the effect of this technique by enabling the second wireframe mode to see all triangles in the scene. Type render_show_triangles 2 in the console and check the way the occluded polygons act.

An example of using hardware occlusion queries is also available in the Content Optimization video tutorial.

Last update: 2019-11-28