TressFX 4 simulation changes

TressFX 4 introduces a number of improvements. This blog post focuses on three of these, all of which are tied to simulation:

  • Bone-based skinning
  • Signed distance field collisions
  • Sudden shock handling

We’ve also have a couple of bonuses in the sample code.  Although not directly part of TressFX, you may find them useful.  They are:

  • Compute-based skinning
  • Marching cubes

Bone-based Skinning

TressFX 3 introduced fur support, which essentially means that each hair root can move with the underlying skinned mesh.  This was done by streaming out post-skinned triangles, then using those triangles to compute transforms for root hairs.  This method is great in that it’s pretty general – it doesn’t matter how the vertices were skinned, and it could also handle blend shapes for example.  The drawback is that it relied on knowing which triangle controlled which hair, which was assigned during export of the hairs from Maya®.  If the mesh changed or reordered, or split differently due to material assignments, the hair indices would need to be remapped as well.  There was also a fair amount of runtime cost associated with deriving transforms from the triangles for use on the hair.

In TressFX 4, we switched to a more direct skinning model, as was used in Monster Hunter Online.  When exporting the hair, you select the mesh as before, but instead of exporting a list of triangle assignments you are exporting bone indices and weights for each hair root.  Additionally, there is a table of bone names so they can be easily remapped to the engine’s bone indexing.

Signed Distance Field (SDF) Collisions

Dynamic signed distance field generation enables high fidelity collision response.

Our biggest feature addition for simulation is the introduction of a dynamic signed distance field collision system.  This enables high-fidelity collision with dynamically animated, skinned meshes.

The included demo generates three signed distance fields – one for the body, and one for each hand of our skinned character.  Breaking it up this way allows us to focus resolution where needed. We wanted to show response to individual fingers, for example.  Each signed distance field is updated every frame.

Sudden Shock Handling (SSH)

SSH is another new feature in TressFX 4. The main purpose of this is to handle fast moving animations. When the character changes its speed or direction, it generates a high acceleration and consequently a big external force. Since TressFX hair simulation uses an iteration-based constraint solver, when a high acceleration gets applied, hair can easily lose its physically-correct shapes and shows unpleasant elongation.

Sudden shock handling mitigates these issues by propagating acceleration from the root of the hair to the tip according to a weighting factor.  The weighting factor varies between zero and one.  At one, the fur will move completely rigidly – thus giving an alternative to full simulation for a form of simulation level of detail.  In addition to the weight, there’s a threshold setting to only enable it under fast motion.

Fast motion can cause stretching. Sudden shock handling handles these situations better, as well as providing a form of simulation level of detail (LOD)


The sample code includes a few extra tidbits as well.  One is a compute-based skinning system, including a Maya exporter that will export mesh geometry, along with skinning weights.  We used this to skin the mesh that serves as input to the signed-distance field system.

To help visualise the signed distance field, we have also included a compute-based marching cubes visualisation system.


We’ve covered quite a bit of the changes to simulation in TressFX 4, from changes to existing approaches (bone-based skinning), new features (SDF collisions and sudden shock propagation), and some related bits in the sample code (compute-based skinning and marching cubes).  There’s still quite a bit more we’ve changed and added that we hope to cover in later posts.

Latest news

AMD Matrix Cores (amd-lab-notes)

This first post in the ‘AMD lab notes’ series takes a look at AMD’s Matrix Core technology and how best to use it to speed up your matrix operations.

Looking for a good place to get started with exploring GPUOpen?

Getting started: our software

New or fairly new to AMD’s tools, libraries, and effects? This is the best place to get started on GPUOpen!

Getting started: development and performance

Looking for tips on getting started with developing and/or optimizing your game, whether on AMD hardware or generally? We’ve got you covered!

You may also like...

Explore our huge collection of detailed tutorials, sample code, presentations, and documentation to find your answers to your graphics development questions.

Create wonder. No black boxes.

The home of great performance and optimization advice for AMD RDNA™ 2 GPUs, AMD Ryzen™ CPUs, and so much more.

Browse all our useful samples. Perfect for when you’re needing to get started, want to integrate one of our libraries, and much more.

Discover what our SDK technologies can offer you. Query hardware or software, manage memory, create rendering applications or machine learning, and much more!

Analyze, Optimize, Profile, Benchmark. We provide you with the developer tools you need to make sure your game is the best it can be!