UNIGINE 2.4: New Multi-Layered Volumetric Clouds, New Terrain, Oil Refinery Demo
Key Changes
- New multi-layered clouds with support for regional weather.
- New terrain system optimized for flight simulation.
- Improved simulation of Earth's curvature.
- Optimized Landscape tool.
- API for geo-referenced vector data manipulations.
- Extended functionality of the VR API.
- Added super-sampling rendering for high-quality AA.
- Added support for Oculus Touch controllers.
- Improved renderer: upgraded SSR and SSGI
- New industrial demo: Oil Refinery.
- New terrain demo based on San Jose region.
New Clouds
Cloud Layers
Introducing new multi-layered volumetric clouds system designed to meet strict flight simulation requirements:
- Several 3D cloud layers for different types of clouds.
- Simulation of multiple types of clouds: cirrus, stratus, cumulus, etc.
- Local clouds coverage simulation (via the FieldWeather object) that lets you control movement of numerous groups of clouds without performance drops.
- Cloud dynamics simulation.
- Cloud density simulation based on a 3D noise model.
- Realistic shadows (including self-shadowing) and lighting.
- Large number of configurable cloud layer parameters (height, density, lighting, shadows, wind, etc.).
- Visibility distance up to 400 km.
- Quality presets for performance scalability.
- Support for curved planet model.
The new system allows realistic atmosphere rendering for civil and military aircrafts, ranging from helicopters and gliders all the way up to supersonic jet fighters and hypersonic UAVs.
The system is implemented by multiple ObjectCloudLayer objects, which replace the old ObjectSky.
Regional Weather
FieldWeather object makes it possible to create local storms or clouds having their own coverage texture as well as to control their movement. This object specifies location of local cloud coverage areas within cloud layers. An unlimited number of FieldWeather objects is allowed, as their performance impact is negligible.
New Terrain
Introducing a new terrain system making it possible to simulate virtually limitless terrains with extremely detailed insets:
- Support for GIS data enables realistic landscape simulation that is close to real conditions.
- Non-uniform grid lets you combine low-detail areas with high-detail AoIs (areas of interest) (e.g. landing and takeoff areas).
- Support for insets of an arbitrary form.
- Support for high resolution (up to millimeter per pixel) for multiple areas of interest.
- A level of detail (LOD) system that automatically adapts available resolution of a terrain grid according to the distance and supports up to 32 LODs for each of the data layers (height, albedo, normal) with different densities and visibility distances.
- Adaptive hardware tessellation.
- Smooth blending of two adjacent LODs with different resolution and geomorphing features provide even more realistic look.
- Terrain generation with a modernized Landscape tool became even simpler (see above).
- Automatic visibility distance limit if there is not enough video memory.
- A number of optimizations including tiles loading, frustum culling, GPU texture compression.
- Support for ray intersections.
This type of terrain is especially efficient for flight simulators: most of the time the plane remains at a very high altitude and the low-resolution data is sufficient. High-resolution data is necessary only around landing and take-off areas. While the new terrain system was designed with simulation industry requirements in mind, it would be also useful for GIS applications and large-scale games.
More details are available in documentation on the ObjectTerrainGlobal. Please use Landscape Tool for its generation.
LODs switching for a non-square high-resolution inset:
TerrainGlobal Demo
A new TerrainGlobal demo showcases capabilities of the new global terrain and new cloud layers. It features:
- 500x500 km area near San Jose (imagery data provided by Esri).
- Maximum detalization is 2 m/pixel, minimum - 30 m/pixel.
- Two cloud layers.
The awesome thing about the demo is that this scene can now be generated in just 7 clicks with the updated Landscape Tool.
Landscape Tool
- Increased performance.
- Removed old ObjectTerrain node generation, it now generates new ObjectTerrainGlobal.
- Added automatic LOD density and visibility distance calculation according to the source elevation and imagery data.
- Added automatic NodeDummy beacons placement to improve navigation in large terrains.
- Added support for the RGBA imagery sources (the transparent channel is used to mark "no data" areas).
- Added support for RGB 8-bit palette images.
- In imagery sources, added support for a set color that will be processed as a no data color and won't take place in generation.
- Added compressed data generation (UNG-packages) in order to reduce the number of files as well as to improve generation and overall global terrain performance.
- Added support of folders as imagery and elevation sources.
- Improved LODs auto-generation (optimized density and visibility distance values).
- Added GPU compression for texture tiles.
- Added progress bar for layers import.
- Added display of generation speed (in tiles/sec).
Rendering Improvements
Screen-Space Global Illumination (Experimental)
Added the SSGI (Screen-Space Global Illumination) effect. To enable the SSGI, use render_ssgi console command or Rendering -> Features -> SSGI option on the Menu panel. To adjust the SSGI resolution, use the render_ssgi_resolution console command. To set the SSGI quality, use the render_ssgi_quality console command. At the moment the effect is very performance-heavy, more optimizations to come with the next release.
Super-Sampling Rendering
Added super-sampling anti-aliasing. It is especially useful for correct rendering of very thin objects.
Use render_supersampling console command to set the resolution multiplier (1 by default).
Screen-Space Reflections
Updates for SSRR (Screen-Space Raytraced Reflections):
- Importance sampling provides more accurate but slower calculation of the rough reflections.
- Num rays specifies the number of rays per pixel for more precise roughness calculations (works only in the Importance sampling is enabled).
- Num steps specifies the number of steps per ray (works only in the Importance sampling is enabled).
- Fast tracing enables more distant reflections, but may cause some artifacts.
- Noise smooths the edges of the reflection.
- Visibility Roughness Min is the value starting at which the reflection starts to fade.
- Visibility Roughness Max is the value at which the reflection disappears.
Other Renderer Changes
- Added new console commands:
- render_bloom_passes specifies the number of passes for the bloom effect
- render_occluders specifies whether the occluders should be rendered
- render_queries_num_frames prints the number of frames required for the occlusion query update
- render_show_geodetic_pivot visualizes GeodeticPivot
- Added the quarter value to render_ssao_resolution and render_sss_resolution console commands.
- The occlusion query now also works in the stereo mode.
- Added the mode enabling occlusion query only for objects with the set Query flag (isQuery returns 1) for the render_queries console command.
- The default D3D11 texture filter is set to linear.
- Increased speed of shaders_reload console command.
- Added forced usage of discrete GPU on laptops by default.
- Removed the HLSL "const in" semantic causing compilation errors.
- Renamed terrain_base material states:
- State "ambient_occlusion" -> "ao_map"
- State "invert_occlusion" -> "invert_ao_map"
- Added debug mode for OpenGL/DX11 (video_debug 1). It redirects video driver messages to the engine console.
- Added the breakpoint-debug mode for DX11 (video_debug 2). It crashes with the full callstack if video driver sends errors.
- Added an option of rendering 2D array textures to FFP.
- Added support for UAV and staging for 3D textures.
- Increased number of maximum textures per material: from 16 to 24 + 8 structured buffers.
- Texture slots number 16 to 24 (inclusive) can now only work with the point filter.
- Released deferred composite GBuffer slots.
- Improved border deinterleaving in ObjectCloudLayer.
- Added soft interaction option for billboards.
- Added support for box projection for Water objects.
- Writing water depth buffer to the opacity depth buffer is now enabled by default.
- Added flag specifying the order of clouds and transparent objects rendering (the render_clouds_transparent_order console command or Rendering settings -> Clouds -> Render after transparent checkbox).
- Added support for common stereo settings in the AppSeparate plugin.
- Added option for hiding the sun disk by loading the Mie texture with the Alpha channel set to 0 (Rendering settings -> Environment -> Scattering LUT: Mie).
- Added velocity calculation for static objects without using vertex shaders.
- Fixed volume_shaft_base material.
- Fixed incorrect behavior of planar reflections on the transparent objects.
- Fixed shadows for parallax objects.
- Fixed tangent space for the plane primitive.
- Fixed ObjectSky clouds shadows.
- Fixed DecalMesh rendering for planar reflections.
- Fixed AMD driver bug with transparent lights and shadows.
- Fixed pool leak in GPU compression.
- Fixed dark dot in the Sun center.
All of this improvements will be utilized in the upcoming UNIGINE Superposition Benchmark.
UUSL
- Added support for three-dimensional compute shaders.
- Added double precision math analogues to the float functions (work on both DX11 and OpenGL): double drcp(double x), double dsqrt(double x), double dlength2(double2 x), double dlength2(double3 x), double dilength(double3 x), double dilength(double2 x), double dlength(double2 x), double dlength(double3 x), double2 dnormalize(double2 x), double3 dnormalize(double3 x), double drsqrt(x), double ddot(x,y), double dmad(x,y,z), double dsign(x), double dabs(x)
- Added INIT_TEXTURE_ARRAY_INT2() for int2 texture array initialization.
- Added TEXTURE_ARRAY_LOAD() for loading a texture array.
- Added TEXTURE_ARRAY_LOAD_LOD() for loading a texture array LOD.
- Added TEXTURE_IN_ARRAY_INT2 for specifying a texture array for passing to function.
- Added new GLOBAL marker to define global variables.
- Added new constant float3_luma.
- Added lerp3() method to perform linear interpolation between three vectors.
- Added gradient4() method to return a gradient value for a given value using four key components.
- Added smoothClamp() method to clamps a given value with a smooth Hermite interpolation.
- Added calculate_dither_pattern() method to return a dither value for a given UV value. It is used for better gradients.
Geodetics
Improved GeodeticPivot
GeodeticPivot has been completely refactored:
- Instead of Fast and Accurate modes, GeodeticPivot now uses a new algorithm that combines the precise azimuthal equidistant projection with simplified trigonometry calculations. The mapping is calculated in accordance with the real ellipsoid form, while the math calculations became faster and easier.
- The topology texture has been removed from the API and editor UI.
- The engine will take parameters for shaders from the closest GeodeticPivot node according to the current camera position.
GDAL Integration
Integrated GDAL API to the engine:
- Provides search and dynamic loading of all required functions from the GDAL library (.dll on Windows, .so on Linux, .dylib on macOS).
- Provides search and loading of all plugins inside the bin/gdalplugins folder. (Note that any data required by GDAL should be placed inside the bin/gdaldata folder.)
Dataset Class
Added a new Dataset class for manipulation with both raster and vector data loaded via GDAL from georeferenced sources. The class is available for all APIs: C++ / C# / UnigineScript.
There is a Dataset usage sample illustrating work with of the vector data: samples -> geodetics.
Oil Refinery Demo
New Industrial BIM (Building Information Model) demo with a lot of detailed objects. Features:
- Over 45M polygons
- Over 19000 geometry surfaces
- Over 1300 light sources
- 200 km visibility distance
VR Improvements
- OpenVR library has been updated to version 1.05.
- Oculus SDK has been updated to version 1.10.1.
- Added the render_vr_emulation console command allowing you to emulate the VR mode (1 is to use Vive, 2 is to use Oculus).
- Added support for controllers vibration in Vive and Oculus.
- Added support for Oculus Touch.
- Added option of locking the head position and rotation for Oculus and Vive.
- Changes the way of re-building the AppOculus plugin.
- Fixed crash in AppVive due to the wrong SteamVR process handling. Added waiting for SteamVR to start.
Other Engine Improvements
- Added ObjectMeshCluster culling support by WorldOccluder* nodes.
- Improved Image::blur performance.
- Added ancestor hierarchy helpers to the Node class: getAncestor(int num), getNumAncestors(), findAncestor(const char *name), findAncestor(int type).
- Added round() math function that rounds an argument to the nearest integer value.
- Added API for UNG packages management. It currently supports LZ4 codec for better performance, and ZLIB codec for better compression ratio.
- Microprofile now supports up to 256 threads.
- Fixed mouse issues when loading Syncker as an editor script.
- Improved GPU monitor for AMD GPUs:
- Added support for OverDrive 5 / 6 / N via ADL2.
- Added support for CrossFire.
- Fixed %s format for Str::sscanf.
- Fixed crash caused during ObjectMeshClutter / ObjectGrass removal.
- Fixed App::get()->isActive().
- Fixed crash in the DDS image loader for ZLC1 / ZLC2 types.
- Fixed MeshDynamic management with the "unique" flag.
Sound
- OpenAL library has been switched to OpenAL master 1.18 pre release.
- Added imitation of the surround sound for the stereo wired headset (HRTF - head-related transfer function).
- Added support for inverse, linear and exponent sound attenuation.
Physics
- Fixed incorrect behavior of the immovable objects.
- Objects velocities now remain within their limits when used in the multithreaded mode.
- Disabled physics will not influence objects.
Samples
LODs Samples
Added two samples illustrating LODs parameters and performance test. To open the LODs samples, go to samples_2 -> lod_system.
Post Sensors
A new Post Sensors sample showcases the following post_sensors features:
- Thermal
- Enhanced Night Vision 1
- Enhanced Night Vision 2
- FLIR
- Visual
To open the Post Sensors sample, go to samples_2 -> post_sensors.
UnigineEditor
- Added geo-positioning for GeodeticPivot's children.
- Added experimental geodetic camera feature (editor_geodetic_navigation_enabled 1 console command): it works if a GeodeticPivot node (or its ancestor) is selected.
- Animations without geometry are now created correctly.
- Better support of additional data_path CLIs.
- Added support for IME typing.
- Improved usage of several data paths in the file dialog.
- Fixed lights parameters when using multi-selection.
- Fixed nodes previews.
- Fixed import of animations in FBX.
Experimental UnigineEditor2
UnigineEditor2 gets a major update with *lots* of new features in this release. (Still being experimental, it is still not recommended for full-blown production use, but we do encourage you to check it out already and send us your feedback!)
- Added prefabs with support for nesting.
- Added the Settings window for managing controls, physics, renderer and sound.
- Added the Rendering and Helpers panels.
- Added the Parameters window with multiple selection support making it possible to edit several nodes, prefab instances or materials simultaneously. There can be several Parameters windows. The Parameters window can be locked for the set of selected objects.
- Added support for dockable windows.
- Added restoring of the windows layout and settings (e.g.flashlight, open viewports, etc.) at startup.
- Added editing of bodies and shapes (joints are not available for now).
- The GPU compression is now used when importing textures to the Asset Browser.
- Added previews for assets and materials. They are automatically updated if the object is changed on the disk.
- Added automatic update of assets if they are changed on the disk.
- Materials can now be created via the Asset Browser.
- Almost all features are now saved to the configuration file and restored after restarting the application.
- Added manipulators to control the size of some types of nodes (NodePivot, FieldHeight, FieldAnimation, FieldWeather, etc.) and body shapes (cubes, spheres, capsules and cylinders).
- File Dialog was mostly replaced with Asset Dialog.
- Added the Console tab to the editor (the engine console is also available).
- Added new context menus.
- Added the FlashLight to the viewports. It is used to set scenes that are not lightened.
- Improved overall editor performance and a lot of bugfixes.
- Added new ObjectCloudLayer and FieldWeather objects.
- Added System Menu options to the Setting window.
- Improved work with the materials Parameters window.
- Improved all context menus.
- Improved input values, you can now use inf and -inf values.
- Added support for IME typing.
- Improved Undo system.
- Fixed OpenGL issues.
- Fixed AssetMaterials issues.
Documentation
- Completely updated Physics section.
- Added tutorials on physics:
- Updated the Custom Materials and Material File Format articles.
- Added article on ObjectTerrainGlobal.
- Added article on ObjectCloudLayer.
- Added article on Property File Format.
- The complete list of API extensions and changes is available in the API Migration Guide.