Technical Vegetation Artist Michael Gerard has returned to 80 Level to tell us about the new Jungle River project, inspired by Horizon Forbidden West, share the workflow behind the environment, and explained how the Fluid Flux plug-in was used to create the scene.
In case you missed it
Previous Articles by Michael Gerard
My name is Michael Gerard. I am a Technical Vegetation Artist at Ubisoft (Paris). I started 3D art like many people, in a bedroom, and by curiosity. It's only after playing The Witcher 3 that I wondered how to create these kinds of environments. I started by using the assets from the game to create my first environments in UE4.
Thanks to that, I was able to participate in the development of Ghost Recon Breakpoint in 2019 as a Terrain Artist. Since then, I have done a lot of freelance work on various video game projects and commercials and worked for French TV as an instructor. I also did a lot of scenes to fully comprehend UE5 and understand the limits of this new engine.
The Jungle River Project
The beginnings of this scene were very messy because I had to choose an environment to inspire me. At first, I had decided on the giant sequoias forest. The composition of this biome seemed interesting and not too complicated since it's an environment I had already worked on for personal projects. Then I realized that there would not be enough challenge and that it did not take me out of my comfort zone.
It's only by playing Horizon Forbidden West and by discovering the jungle that I stopped my choice. It's a type of environment that I had never done before. The challenge was even more complicated as I had to find a solution to get rivers as close as possible to those seen in the game
When I work on a scene inspired by a game, I avoid going to other references than those present in the game. The goal is to stick as much as possible to the spirit of the game, going to look elsewhere could distort my idea and my feeling left by my gameplay sessions.
Also, the photo modes present in the games are real tools for me. They help me to look at the composition of the model in great detail. Where does the stem start and where does it end, which techniques were used to arrange the leaves, are they complete branches or individual leaves, etc.? It allows me to analyze the textures in more detail. I must be the only one to use the photo modes so close to the plants, by the way.
The Modeling Workflow
Most of the details have been created with SpeedTree 9, except the 3D branches and the rocks, which come from Megascans. The trees are hybrids, the structure of the tree (trunks and branches) was made with Nanite, and the foliage keeps the classical approach.
All the trunk, leaf, and terrain textures come from Megascans and ScansLibrary. Combined on Mixer for the terrain ones and modified on Substance 3D Designer for the plants and foliage ones in order to add details, cracks, or color variations.
Unfortunately, I gave this tool to Ubisoft, so I can't show it, but overall, it isolates the edges of my texture and from this mask, I can create cracks and variations on the edges. By reversing this mask, I can concentrate on the changes in the center of my texture.
Setting Up Vegetation
For the foliage, I had to go further than I usually do. If we take the example of the Asplenium, making a plan alone was not enough, it lacked volume. So I switched to 3ds Max and used the Ripple modifier.
In order for everything to work perfectly, I had to push the number of polygons a little further than it should be for real-time. But I lose very quickly this polygons excess over the LODs and the last one is an impostor, so it has very little impact on the performance.
As for the trees, these are hybrids, as explained above. The flowers contain a simple 3D stem, a plane for the flower and for the "leaves", it is a 3D object found on Megascans.
Tips on Vegetation Modeling
If I can give some advice on vegetation modeling, it would be on the level of trees at first. I see a lot of artists trying to stick to reality as much as possible, especially when it comes to the size of the leaves. If the idea is good, the result is often not conclusive when you switch to the engine because the foliage ends up flickering and it becomes complicated to define the type of trees you are looking at.
It is better to increase the size of the leaves even if it means putting less on a branch. The player or viewer will be able to more easily identify the tree he is looking at, even when they are in the second or third plane.
The important thing is the silhouette, the leaf should be recognizable no matter what the distance. Horizon Forbidden West does it very well, you can also notice it in Red Dead Redemption 2, even if it is sometimes pushed to the extreme on some models.
For ground vegetation, choose 3D stems rather than planes for dense patches. The result may be a bit heavier, but you will have less overdraw (transparency overlap). It is also easier to reduce the number of polygons in a 3d object than a plane based on an opacity texture.
As said above, the textures come from ScansLibrary and Megascans, they are in 4k and 8k. I used the virtual textures to overcome the blurred textures of Nanite and added a normal amount of detail to add a little more relief:
Actually, these textures are quite simple, they were created on Quixel Mixer by combining several textures together. I only exported the Normal Map.
Assembling the Scene and Scattering Details
Before the final layout, I tested several of them but they didn't suit me, it wasn't "Horizon" enough, too small and too dense. On the opposite, I tried a much larger one, but I ran into a problem with the use of Fluid Flux. As it does not handle very well the large terrains, I had to redesign my entire layout to finally get the one you can see.
The details of dead leaves, after having created them on SpeedTree. I placed them with the foliage tool and the Fill option for the rocks in the water. I then came to remove the misplaced or hanging branches.
I always work from macro to micro, which makes more sense to me. So I started with the terrain for which I used the Landscape Stamping tool which allows you to modify the terrain with Blueprints and place the mountains as you want. This function is native to UE4/UE5, the tool just adds the possibility to use Height Maps.
For the variation of the terrain textures, I used a custom brush, also created on Quixel Mixer, and I would switch to Pattern paint mode based on the world coordinates.
I placed the cliffs and rocks and drew the river. I used the terrain spline tool to create the river bed, painted the desired textures, and ran the simulation. Once I had a convincing result, I placed the rocks in the river with a procedural foliage volume to run the water simulation one last time, baked it, and assigned the modified shader.
Then I moved on to the vegetation, first the big trees, then the smaller ones, and finally the ground vegetation. Once all that was in place, I laid out the moss on my rocks and debris.
Setting Up Lighting With Unreal Engine 5
For this scene, as for all the others, I utilized the basic UE5 lighting. A Skylight on which I added a white cubemap and adjusted the parameters related to the occlusion to solve the artifact problems.
A Directional Light in which I change the Volumetric Scattering Intensity to increase the intensity of the Volumetric Fog.
An Exponential Height Fog with the Volumetric checked.
And a Sky Atmosphere in which I modify the parameters present in the category "Atmosphere - Rayleigh" to change the temperature of the atmosphere and the light.
Using the Fluid Flux Plug-In
It is a powerful and interesting tool. It allows you to easily create rivers and water points. It is very customizable and as it is a real-time simulation, you can quickly correct problems and add elements to influence the flow. It works in several parts, a simulation box and fully customizable water sources.
But it suffers from some limitations and problems anyway. It is limited to small areas, on large maps, it becomes complicated to generate everything in real-time, even on a big machine. I haven't tried to lay down several simulations, so I don't know if they merge together.
You can bake the simulation, but it is limited to a square texture (512x512, 1024x1024...). I didn't try to push the thing to see if it was possible to override the values outside the simulation box.
The list of actors to ignore is also quite limited since it will take a family of actors and not a particular actor. For example, if we put vegetation with the foliage tool, we can't choose the actor to isolate, it's either all or nothing. I was able to isolate my trees because they are blueprints, but for the ground vegetation, I had to ignore them entirely. This was not a problem for me since I don't have any vegetation in my river, but if you want to make a lake with vegetation on the edges, you'll have to cheat a little bit so that the simulation detects it.
My advice to beginners would be to never be afraid to make mistakes, to experiment, and to try different workflows. There are a thousand ways to achieve the same result, but very few of them are entirely suitable. So don't hesitate to take the best of everything and use it to develop your own way of working.
Going out of your comfort zone is always instructive, whether it is on a creative level that pushes your imagination, or on a technical level that opens up new knowledge.
It can also be interesting to share one's WiPs either to the community through artists' groups or to people around you. An outside look will reveal possible inconsistencies in our work or bring new ideas.
This content is brought to you by 80 Level in collaboration with Unreal Engine. We strive to highlight the best stories in the gamedev and art industries. You can read more Unreal Engine interviews with developers here.