UNIGINE 2.3.1: Landscape Optimizations, Compute Shaders Support, Renderer Optimizations
- Landscape tool optimizations (upto 4x faster, less RAM required)
- Renderer optimizations, including VR ones
- GPGPU (General-purpose GPU) computing via compute shaders
- High-quality DXT texture compression on GPU
- Structured buffers for CPU <-> GPU data transfer
- New Tank demo
- Bugfixes and minor improvements
This is primarily stabilization release.
Landscape Tool Optimizations
Landscape tool (added in UNIGINE 2.3) is under very active development and here are the current improvements.
Landscape generation is upto 4x faster now. For instance, a 30x50 km map of Moscow with 0.15 meters/px resolution now takes ~1 hour, instead of ~4 hours it used to take in 2.3 release (on the very same hardware, of course).
Less RAM Required
RAM requirements are now much smaller, letting you generate huge areas with only a few gigabytes of RAM installed. For instance, we were able to succesfully generate the entire China landscape (that's about 10 million square km!) on a machine with just 8 GB of RAM.
The complete list of improvements:
- Increased the max resolution of textures: 8192x8192 (8k) textures are supported from now on
- Added ECW data format support
- Added generation of big (out of RAM) layers: it is now possible to generate landscape layers that are bigger than the available RAM, and it's also possible to specify the RAM usage limit
- Added landscape mipmaps generation
- Added the first LOD parameter: the parameter value will be set to all terrains generated via the Landscape tool
- Added fast GPU-accelerated texture compression
- Added support for the high-detailed imagery generation with the low detailed elevation
- Fixed layers resolution calculation
- Fixed normal maps calculation
- Fixed junctions on normal maps and imagery
General-Purpose Computing for GPU
Compute shaders were actually internally used in UNIGINE for a while, and starting with 2.3.1, there now is a public API for them. You can now off-load different CPU-heavy calculations (like fluid dynamics, particles, advanced physics post-effects, etc) to GPU. That yields huge performance jumps, thanks to fast parallel GPU calculations.
We provide a sample that uses compute shaders to calculate that target positions and velocities of more than 1 million particles using the GPU, and then renders them, all that with exceptional performance. The target particle positions are taken from mesh files.
A new StructuredBuffer API object lets you transfer the data between CPU and GPU, in both directions. For instance, you now can push huge amounts of data from your program to the GPU, run some GPU-side calculation over that data, and fetch the results back to CPU side, all that without using textures.
From now on, an array of lights, particles or any custom data can be sent to the GPU via the structured buffers.
Also, it is possible to use RW (RGBA8) and W (any format) textures to pass the data to GPU.
Our DXT compression now also runs on the GPU (using exactly the aforementioned GPGPU functionality), and that's orders (yes, plural) of magnitude faster than compressing on CPU. That is available via the API and already utilized in the new Landscape tool.
We also improved compression quality: the compressed images now have less perceptible visual artifacts.
Supported texture formats are DXT1, DXT1A, DXT3, DXT5, ATI1, ATI2.
Example projects on compute shaders, RW textures, and structured buffers are provided in the C++ Samples section of Unigine SDK Browser.
Our rendering improvements focus on extending the supported GPUs lineup, while keeping final image quality comparable across them. That lets you run Unigine-based applications of very different GPU series, and even generations.
Also, VR technologies are rapidly evolving these days, bringing in additional VR-specific challenges while still demanding for continuously improved graphics.
So in this release, we made these:
- Added GPU-accelerated DXT compression
- Fixed Occlusion queries for the main viewport
- Added render_water_anisotropy for texture anisotropy level control in water rendering
- Changed render_shaders_quality console command: it changes the BRDF and some water effects quality calculation
- Added a bunch of new console commands to enable / disable writing to the Gbuffer:
- Added render_skip_transparent_deferred console command to enable / disable the transparent deferred pass
- Added render_soft_shadows_quality to control the quality of the soft shadows
- Improved Viewport::renderNode behavior
- Added StructuredBuffer object
- Improved LightEnvironmentProbe rendering (when the probe size is infinite)
- Improved Environment intensity parameters behavior: they are totally disabled while the corresponding intensities are set to 0
- Added shoreline wetness mask (for per-object effect disabling)
- Removed render_bokeh console variable. The Bokeh effect is now disabled automatically along with the DoF effect (via render_dof 0 console command)
- Fixed water caustics artifacts
- Fixed reflections on transparent objects lit by LightEnvironmentProbe
- Fixed mipmaps switching for forward-rendered objects with the Roughness material parameters
- Improved VRAM management for ObjectTerrain / ObjectGrass
- Fixed disabling of shadow shafts when material mask rendering buffer is disabled
- Fixed sRGB-correction of the gui_based material
- Fixed incorrect wireframe color after shader cache cleanup
- Fixed curved water normals behavior
- Fixed terrain rendering on OS X
- Fixed incorrect ObjectSky object behavior with render_panorama enabled
- Added new UUSL functions to work with RW and W textures and StructuredBuffer: INIT_W_TEXTURE(), INIT_RW_TEXTURE(), INIT_RW_STRUCTURE_BUFFER(), INIT_STRUCTURED_BUFFER
- Added POINT_IN, POINT_OUT topology type to geometry shader
The complete list of Console command changes is available in the Console Migration Guide.
New Tank Demo
The new Tank demo brings a realistic model of a tank, with an interactive mode where you can drive the tank and blow up targets.
Tanks' tracks and suspension are animated elaborately: they interact with the terrain providing real physics behavior of the tank chassis. Also, different parts of the tank (tracks, spaced armour rubber skirts, suspension, tank gun kick, antenna, etc.) are dynamic: their animations depend on tank's movements. The demo also provides sounds of gunshots, engine noise.
The demo is implemented using the C++ API.
The demo (together with its source code) can be found in the Demos section of Unigine SDK Browser.
Other Improvements and Bugfixes
- Added support for intersections with curved water
- Added support for intersection / physics with curved terrain
- Added new workflow for Geodetic Pivot: topology texture is stored inside the GeodeticPivot node
- Fixed resource streaming in the x86 builds
- Fixed incorrect asynchronous texture loading behavior for textures streaming
- Fixed -render_width and -render_height options of the AppVive plugin
- Fixed engine loading freeze when HTC Vive is connected via USB
- Fixed Terrain masks export issues
- Fixed call of the Leave callback of PhysicalTrigger
- Fixed texture import in OccluderTerrain
- Fixed that engine didn't build without USE_MEMORY directive
- Fixed texture colors conversion in some cases when creating DXT1/DXT5
- Fixed that ObjectText::setText() did not update bounds in the same frame
- Fixed deadlock in ObjectMeshClutter during content generation
- Removed XAudio2 support
- Fixed getDMat4Arg/getDMat4Data() XML class methods
- Fixed a crash when attempting to reload unique MeshStatic resources
- Fixed multi-threaded grass cleanup
- Added video and system memory usage counters for ObjectGrass and ObjectTerrain nodes
- Added an option to export multiple nodes to separate *.node files
- Fixed editor crashes when running with Mesa drivers
- Added Soft intersection parameter to ObjectWaterGlobal
- Improvements related to GeodeticPivot:
- Added environment rotation according to the camera position relative to GeodeticPivot (curved scattering)
- Added automatic topology updates on GeodeticPivot transform changes or re-parenting
- Added automatic geometry/content flattening when re-parenting removes the Geodetic Pivot from the node's ancestors
- Removed NED positioning mode from the GeodeticPivot node (however, Ellipsoid class still has all the math methods needed to calculate NED transforms)
- Fixed ObjectWaterGlobal positioning relative to GeodeticPivot
- Fixed incorrect transform in ENU positioning mode in GeodeticPivot node
- Fixed TerrainEditor crashes
- Fixed incorrect saving of mipmaps quality in LightEnvironmentProbe
- Fixed Impostor mode of the Grabber
- Fixed saving into incorrect folders when grabbing LightEnvironmentProbe, GeodeticPivot and FieldShoreline textures
- Fixed albedo buffer (Rendering panel) hotkey
- Fixed an engine crash on node selection immediately after FBX import
- VideoGrabber: velocity buffer is now used during the sequence grab
- Added mipmaps generation to the ImageDDS tool
- Added water normals buffer (can be found in Rendering -> Debug -> Water World Normal panel)
- Added new TextureRender class methods (C++ API):
- setUnorderedAccessTexture() to set unordered access texture to device
- unbindUnorderedAccessTexture() to unset unordered access texture from device by slot
- unbindDepthTexture() to unset depth texture from device
- unbindColorTexture() to unset render target texture from device by slot
- Added new Render class methods (C++ API)
- renderComputeMaterial() to set up material and dispatch compute shader
- getViewport() to get the viewport of the main window
- seViewpoirt() to set the viewport of the main window
- Added default constructor for quaternion (C++ API)
- Added all the missing cast-methods for Body* classes
- Added Object::render() (C++ API) function to draw object surface without render sequence
- Added Blob::setData() method (C++ API)
- Added an option to reset object's Body by calling obj->setBody(BodyPtr())
- Removed updateTopology(), clearTopology(), saveTopology(), deleteTopology() ObjectTerrain class methods
- Added new get2DSmooth() / get3DSmooth() methods to the Image class
- Improved HTC Vive API for buttons
The complete list of API changes is available in the API Migration Guide.
Chinese documentation got a huge update, and now it covers almost everything.
Updates to English documentation include:
- Added an article on the new experimental Landscape tool
- Added a Migration guide section for migrating your projects from 2.3 to 2.3.1 version
- Documented a lot of missing API methods
- Other changes and fixes to bring the actual information on engine's features