At the beginning of this year we saw the first implementation of AMD’s TressFX real-time hair simulation technology in Crystal Dynamics’ Tomb Raider. At the time it was a rather novel feature and because of the game’s third person perspective the added visual fidelity that TressFX brought to Tomb Raider was easy to quantify. Couple this novel technology with a pair of marketing campaigns from both AMD and Square Enix, the games publisher, and you have a recipe for over-hyping a good product.
There were a number of issues with the TressFX that came into full focus as millions of people played through Tomb Raider over the past nine months. Performance takes a big hit when you enable TressFX; As Grady McKinney over at [H]ard|OCP noted in his review, enabling TressFX can reduce frame rates by 10 to 20 percent depending on your system configuration.
Another issue was bad hair days, or perhaps unexpected simulation behavior from the developer’s standpoint. Users reported instances of TressFX causing Lara’s hair to spike in random directions or turn into a constantly shimmering afro-like structure or even in extreme cases to go completely missing all together. But even when TressFX was working correctly some users took issues with the level of realism involved in the simulation. For example there was a strong consensus that Lara’s hair was too light and didn’t accurately depict how hair responds to movements and weather conditions in real life. For Lara everyday was an amazing hair day thanks to TressFX.
With that feedback in mind AMD announced an update to its hair simulation technology, TressFX 2.0, at its developer conference in mid-November. This update brings a number of changes aimed at increasing the accuracy of TressFX’s hair simulation and performance enhancements aimed at reducing the frame rate penalty involved in using AMD’s hair simulation technology.
In the initial version of TressFX there were a lot of strands that were being rendered at full quality that were never seen. Additionally AMD hadn’t optimized TressFX for level of detail considerations, meaning that however close or far away from the camera Lara was didn’t affect how her hair was rendered. This may not seem like a big issue, but decreasing the level of detail on distant objects is how all developers maintain playable frame rates in complex scenes.
The inability to change the level of detail on the TressFX simulation depending on Lara’s distance to the camera meant that a lot of resources were being used for no visual gain. This is a similar problem to early implementations of hardware tessellation where developers would set the Tessellation level so high that the GPUs would be rendering triangles that were smaller than your monitor could display, effectively wasting geometry compute for no tangible improvement in graphics quality. This lead hardware vendors like AMD to introduce the option to limit Tessellation levels through their drivers. But this won’t happen for TressFX because it doesn’t use fixed function hardware; rather it relies on the general purpose compute capabilities of your GPU.
In TressFX 2.0 only the strands of hair that are visible to camera are rendered at full quality, and the strands of hair that are under that top layer will be rendered at a lower quality. The quality of TressFX simulation also varies with the distance from the camera now; this addresses the LoD issue we covered earlier. AMD is compensating for the reduced simulation quality at distances by increasing the thickness of the strands being rendered. Thus the volume of the hair being rendered will remain more or less constant, while only the complexity will vary.
AMD has also optimized TressFX 2.0 at a lower level by using more resource efficient draw calls and tiled resource caching while also making various improvements to the shader code. Details on these changes are sparse, but it’s clear that AMD has spent a lot of time optimizing TressFX 2.0. To that end the company ran some benchmarks comparing 1.0 to 2.0 in terms of the time required to render. On higher end solutions like AMD Radeon R9 290 TressFX 2.0 takes half the time of the original and on slower cards like the Radeon R9 280X TressFX takes only about a third of the time to render. TressFX 2.0 is clearly all about improving performance and AMD’s team has delivered.
The other big change that TressFX 2.0 brought with it was improved modularity, better organization, and a lot of code clean up. These improvements are meaningless to end consumers, but for prospective developers looking at using TressFX these changes should make it a lot easier to implement the technology in their games. AMD is also suggesting that developers look at using TressFX for fur and grass simulation in addition to just hair rendering. Hopefully we’ll see some of those efforts come to light in the future.
Speaking of developers, TressFX remains in a kind of limbo land. Since the launch of Tomb Raider almost year ago we have yet to see TressFX used in any other games. This isn’t necessarily a death sentence for AMD’s first try at digital hair products, and TressFX 2.0 certainly does up the ante, but the lack of new titles arriving with TressFX support is concerning. AMD hasn’t run out of time yet, but if there aren’t a few games with TressFX by this time next year then you’ll know that the technology is dead in the water. But perhaps developers were just scared away by AMD’s spaghetti code, which should be squared away in TressFX 2.0. Whatever the reasoning, we’ll know the outcome soon enough.S|A