
How stunning visual effects bring Ghost of Tsushima to life

This post was originally published on this site
With foliage, the plants are all rigged with joints that respond to the local wind speed. We worked with the coding and environment teams to create separate controls for trunks from the branches, which allowed us the flexibility to create the wide variety of trees and shrubs needed for Tsushima. On top of the larger trunk and branch movement we layered noise that causes the smaller ripples across the leaf surfaces.
The grass and pampas fields were a particularly iconic element for the game and one that required a lot of back and forth work between the rendering, environment, and VFX teams. The fields are a mix of procedurally-generated triangles for the grass and modeled assets for the pampas stalks and tufts. Initially, we tried using particles to achieve the wave-like motion by displacing the grass in overlapping arcs. The visual quality on the grass was good, but it looked wrong for trees and bushes plus the performance cost was a bit higher than we could afford. For our second attempt, we added two layers of procedural gusts to the environment. The first is a large noise pattern that scrolls with the wind direction; layered on top is a texture that scrolls across the terrain for smaller details on the grass. The advantage of this approach (aside from cost improvements) was that we were able to use the coarser wind gust noise on the trees and bushes as well, which made the grass and other foliage match in a more seamless way.
We did actually end up using the particle grass displacement tech, but for pushing the grass around as the player and horse run through it. This has been done before in games, but one of the key improvements we made here was that by using the particle system to control the displacement, we were able to leverage our expressions for more advanced behavior. One of these behaviors was to make the grass bounce back in a realistic manner by applying a damped wave to the strength of the displacement, which prevents the grass from snapping back to its rest position in a linear and unnatural fashion. The video below is an example of the grass displacement and a debug view of the particle system controlling it. The green parts of the trail represent displacement and the red parts are where the displacement fades. If you look carefully you can see that the grass loses and then regains displacement values in smaller and smaller amounts as the trail gets further from the hero. This creates a natural reverberation of motion, making the grass feel more lifelike.
Last but not least, the character tech art team took the lead on adding dynamic cloth and ropes to the game due to their high use on the characters themselves. Each of the rope and cloth simulations uses the same wind inputs as the foliage and particles, adding to the illusion that there is actual wind moving through the scene.
Animals
We assumed early on that any animals the VFX team created would only be seen far away, but as the project evolved we realized they could play a bigger role. For this feature we teamed up with the same rendering coder who wrote the particle system during Second Son production, Bill Rockenbeck. His first step was to let particles spawn fully-rigged and animated mesh objects. Once that was up and running, using the same terrain position information we used on the windicator we could match the orientation of the models to the terrain and have them collide with it when necessary.
We added animals such as frogs, birds/cranes, fish, crabs, bugs – these creatures all have reactivity to Jin and other characters in the world. By using a very low value wind sphere around characters (including Jin) the animal particle effects are able to detect when people are nearby. We used a new conditional event system to change particle motion when this condition was met, causing the animals to scatter away from people. This was also used on projectiles and impacts, which meant that arrows and daggers would also scare animals away.
In the following video you can see some early iteration on the interactive crab effects scattered across the beaches. We started with some static meshes (probably my finest modeling efforts) and iterated on the behavior. I wanted the crabs to maintain some minimum range from Jin to prevent him standing directly on top of them and make them feel appropriately skittish. To help me debug behaviors, the crabs in the video are colored white when they are moving and orange when they are still.
Leaves and Duels
Because one of the hallmarks of Ghost of Tsushima is the wind, we knew that we would need to add a ton of leaves and make them feel really stylish, but also naturalistic. This is why there can be tens of thousands of leaves on screen at any moment in Ghost and they all interact with the wind, environment, and characters.
In order to make the leaves feel appropriately realistic, we spent a lot of effort on making them land correctly based on the terrain. Each leaf is modeled as a disc which uses 3D math to cause it to rotate appropriately in response to torques applied as it contacts the ground. Beyond just landing on terrain, we modeled some other advanced behavior: leaves in Ghost land on water surfaces and flow with the current, and will fall down a waterfall and sink over time as they drift.
Near the end of development on Ghost, a QA tester came to me with a strange bug: leaves would fall into campfires and sit unburnt on the terrain under or next to the fire. I agreed this was pretty weird and decided to resolve this by placing a wind emitter in campfires that the falling leaves would react to. This upward draft kept leaves out of the fire for the most part and was a nice detail.
Duels became a well-loved element in Ghost from their first tests and from the very beginning the VFX team was given the reins by the game directors to help create scenarios that best showed off the interactivity in our game and particle systems.
In many of these duels, we created persistent leaves that would react to player and AI movements. For this, we repurposed the grass displacement tech we built and allowed particles to sample this information. By doing this, we were able to make the leaves part in a stylish way when characters moved rapidly through them. The goal here for duels was not perfect realism, but stylish beauty in motion. We used the same event system described above to look for times when the player displacement values were above a threshold; we then created a falloff so that the leaves would settle from the initial motion after a short time and could then be pushed again. We also used a noise pattern that temporarily allowed leaves to be picked up from the ground by the passing wind, helping to simulate gusts and the unstable nature of leaves.
Other types of duels also make heavy use of other dynamic particle systems, such as floating lanterns, candles that blow out, heavy fog parting at your feet, lightning strikes, and more. We used techniques similar to the leaves on the lanterns, where each lantern is actually a set of particles that move and bob on the water based on player displacement. For the dynamic candles in the second Ryuzo duel we added wind emitters to the sword swings and sampled those on the candles. If the wind passed a threshold, we used our event system to snuff out the fire and light while spawning up a new smoke wisp and ceiling smoke effect. Additionally, players generate wind while rolling and dodging, so quick movements past these special duel candles will also put them out.
Mud and blood
When characters run, roll, slide, and fall on the ground they dynamically add mud to their meshes. Having our characters get dirty as they live in our world was an early goal from art direction to set the tone of the game. During animations, we add mud “sources” in varying amounts to places like knees, elbows, and shoulders so that Jin and others look appropriately battle-dirty. If you look at famous fight scenes from samurai movies, you can see the inspiration for Ghost here: the characters push mud with their feet and are muddy from all of their interactions with the ground.
Like mud, we create blood sources that dynamically add blood to the character meshes during combat, showing their wounded state. Each impact added blood near the sword strike location and a bit beyond. This was used in cutscenes and scripted moments in addition to systemic combat.
Besides adding blood to character models, every attack creates a particle effect with thousands of blood droplets and blood strings. Each of the droplets lands on nearby geometry, and in the water it even disperses into clouds that move with the current.
Build at a large scale
A key component of building at scale was to make our VFX match up with environments and not have to hand place them. We knew that with our small team size and a giant world to fill that we would have to create some form of procedural placement because the environment biomes were changing very frequently. We didn’t want to spend all of our time just maintaining content, so it had to be self-correcting.
Growth and biomes
Here’s a simple example: we wanted particle leaves to fall in only the forested areas and not in the grasslands. The first approach we tried was very brute force: we placed an effect in the trees that were grown procedurally around the island. This failed pretty quickly because the environment was instancing hundreds of trees in small spaces, which, while fine for geometry, was too expensive for particle systems. We had some small success by setting our particles to only appear when very close to the trees (~50 feet), but this felt like a failure when the view distances were so far. The other problem with this approach was that when we dropped a leaf from the canopy 40 feet above and the player is riding a horse, it might not even fall into view by the time they passed the tree – so the leaves were often not visible.
Our second approach was to use the growth system in the same way as the environment, where we procedurally placed the particle systems alongside the trees in the same space by using the same masks and expressions. For this approach we needed to place overlapping circles of leaves within an occasionally complex mask shape. The circles were pushed in the distance of their radius from the edge of the mask rules, which meant there would often be large gaps where there were no leaves present due to the growth rules and expressions. We could balance this by creating more, smaller emitters, but at the cost of performance. It was also difficult to fix specific areas because if we changed the growth rules to fix the density or holes in an area we were looking at, we would often break other clusters of forest that were previously working well. Despite all of this, the technique mostly worked and even though there were some flaws we nearly shipped it.
In image 1, this screenshot demonstrates using our growth tool to add particles based on the rules that determine where the trees are. There are major gaps, so this ended up being below our bar. For image 2, I’ve increased the amount of particle emitters grown substantially. This nearly works, but takes up valuable performance we could use elsewhere. Image 3 shows our third approach, the biome map. One of our rendering programmers was working on a feature for the lighting team that would use data from the environmental growth masks that could be accessed in real-time. I asked if we could piggy-back on this technology and luckily enough we were able to do so. What this got us was the ability for the particle system to know what biome any specific particle was created in. Image 4 has a debug particle system that shows how the particles read this data. The blue areas are grasslands and the green is the forest.
The first pass of this was a little blocky but once I used a noise pattern to modify the sampled information it became much more organic and usable. This became the core of our new environmental ambience system when combined with other features like sampling the terrain position, material, and wind direction. In any average location, we were able to remove hundreds of grown particle systems from the environment and replace it with a single system that followed the camera and was much more accurate to the environmental biomes.
Even though we moved a good deal of our effects from the growth system into a real-time biome system, we did utilize the growth system for some particle effects in Ghost. Some examples include birds placed at the edges of forests, crabs and seagulls in the beach areas, herons in the rice paddy areas and cranes in the marshes. Lastly, we used the growth system to add fog banks at the edges of the forest. In all of these cases, whenever the environment team changed where the forests, fields, and beaches were located, the VFX came along automatically.
Vistas and navigation hints
In Ghost, the vistas are important to both the gameplay by helping you find objects as well as being an important part of setting the tone and art direction. We felt that finding quests should be as natural as possible so we created a variety of effects that could be used to indicate quest locations and challenge content. Some examples include different types and scales of smoke at mission or challenge content, birds that circle a haiku opportunity, steam rising from an onsen steam bath, and more.
Putting it all together
The visual effects in Ghost of Tsushima are an integral part of the environment, with every frame containing many separate systems working together to enhance the dynamic look of the game. From the foreground biome and animal elements to the background weather and content markers – the visual effects helped bring the world to life and make it a joy to explore Tsushima.
Thanks for reading and I hope you’ve enjoyed your journey through the visual effects of Tsushima. If you’re still curious to learn more about some of our underlying technology, you can watch a talk I gave for the Game Developers Conference in 2014 that focuses on our expression-driven particle systems.