We are pleased to announce the release of Flex 1.1.0, available immediately to all registered NVIDIA developers. Flex 1.1.0 is the largest update to Flex since its initial release, and this post will cover a few of the most notable new features.
To get started, the latest release package is available from the developer zone here.
Full documentation can be found here.
New Direct3D 11/12 support
To better serve the game development community we now offer Direct3D 11/12 implementations of the Flex solver in addition to our existing CUDA solver. This allows Flex to run across vendors on all D3D11 class GPUs. Direct3D gives great performance across a wide range of devices and supports the full Flex feature set.
Using Direct3D simply requires linking against the D3D simulation libraries. Flex can run directly on a game’s existing Direct3D device and render context by passing them to NvFlexInit().
GDC 17 Presentation
Check out our GDC presentation here:
D3D Async Compute for Physics: Bullets, Bandages, and Blood
Session Description: Particles have many uses, from low to high complexity: non-colliding sparks, shell casings colliding against the ground, particle-particle collision for rigid debris, particle grids for cloth, up to fluid dynamics. Now that Async Compute allows us to utilize otherwise wasted GPU cycles, it is attractive to move more of these effects to D3D Compute.PDF | Video
New collision shape API
It is now easier to specify collision shapes to Flex. We've overhauled the API to better match PhysX by adding native support for box primitives, convex mesh instancing, non-uniform scale, and reducing the amount of data developers need to specify. See NvFlexSetShapes() for details.
In addition, Flex will now interpolate transforms for moving convex shapes and find the approximate time of impact. This improves robustness for particles colliding against fast moving character collision shapes.
New local-space simulation
In games it is common for objects or characters to move in non-physical ways, e.g.: fast player turns, or large animated accelerations. Coupling physical simulation with these objects is a challenge for real-time solvers because of the large constraint errors these movements can introduce.
In Flex 1.1 we have introduced a new “moving frame” API that allows simulating Flex particles in the local space of an attached accelerating rigid frame, e.g.: a character’s root bone transform. The inertial forces from this frame's movement can then be added in a controlled fashion that limits the effect of non-physical movements. See the NvFlexExtMovingFrame API for details.
New UE4.14 integration
We have updated the Flex UE4 integration to UE4.14.3 and included our Direct3D solver as the default (CUDA can still be enabled through build configurations). If you are a registered Unreal developer you can find the Github repository here.
(Note that you must be logged in to view this page)
We’ve added new test maps for level-streaming, collision against landscape components, local-space simulation, and more. UE4.15 support will follow shortly.
New buffer-centric API
Supporting Direct3D has required some re-architecting of the core Flex API. Data provided to Flex must now be provided through a buffer object similar to the concept of a Direct3D buffer. This allows Flex to make sure data is sent to the GPU as efficiently as possible, and ensures that synchronization is performed correctly. See NvFlexAllocBuffer() for details on how to manage buffers.
- New API style, for consistency with other products the API has now an NvFlex prefix and follows a naming convention similar to PhysX
- Add support for DirectX, in addition to CUDA there is now a cross platform DirectX 11 and 12 version of the Flex libraries that Windows applications can link against
- Add support for max acceleration clamping, see NvFlexParams::maxAcceleration, can be useful to reduce popping with fast moving kinematic shapes and large interpenetration
- Add support to querying compute device, see NvFlexGetDeviceName()
- Add support for flushing compute queue, see NvFlexFlush()
- Add support for multiple library instances, NvFlexInit() now returns a library which is bound to a single compute device
- Add support for local space particle simulation, see NvFlexExtMovingFrameInit() and two new local space fluid and cloth demos
- Add support for CUDA 8.0.44
- Remove NvFlexError enum, errors will be reported through the NvFlexErrorCallback passed to NvFlexInit()
- Remove NvFlexMemory enum, users should use the new NvFlexBufferType
- Fix bug in inflatable constraint solver that could cause some shapes to generate NaNs
- Fix for SDF contact generation when the particle lies completely outside volume, fixes a problem with ghost contacts
- Fix for friction being incorrectly applied on trigger shapes
- Fix for multi-phase fluid cohesion not working correctly, re-enable Rayleigh-Taylor instability test
- Fix bug with public projects that referenced internal CUDA paths
- Fix for calling NvFlexSetInflatables() with a count of zero
- Fix for buoyancy parameter
- Fix for bug in BVH builder that could cause missed collisions
- New optional NvFlexDevice library for handling GPU selection and initialization in CUDA
- New buffer based API, all data must now be passed to Flex through buffer objects created through NvFlexAllocBuffer()
- New stable shape matching code for more robust and efficient soft bodies, removes need for NvFlexParams::inertiaBias
- New collision shape API supports instancing of convex meshes and a much simplified API, see NvFlexSetShapes()
- New global stiffness param for soft body assets, this can make soft bodies stiffer while providing many local degrees of freedom, see NvFlexExtCreateSoftFromMesh()
- Improvements to collision detection for moving shapes, Flex will now perform a CCD check also taking into account the shape trajectory using the prev/current transforms of each shape