Michael Gerard provided a detailed breakdown of the Skellige Scene inspired by The Witcher 3, which features rich vegetation covered by snow, focusing on using SpeedTree to create trees and foliage and on controlling the amount of snow with a dynamic snow system.
In case you missed it
You may find these articles interesting
Introduction
I am Michal Gerard, a Senior Level and Vegetation Artist. Self-taught since 2015, I have been able to work on various projects, including Ghost Recon Breakpoint and other unannounced ones. Yes, a lot has changed since then, I left Ubisoft in 2023 to go back to freelancing and creating online courses.
About the Skellige Scene
Two years ago, I released my first scene inspired by The Witcher 3, and given the pleasure I took in creating this scene and the love I have for this game, I thought it would be interesting to recreate different scenes inspired by all the maps. This is my third scene after Kaer Morhen and Toussaint.
As for what inspired me to do Skellige, it's a map I really enjoy in the game. You should also know that I restart the game quite often, and my last save was in Skellige. So, I took that as a sign.
After looking for references in the game, I noticed that the snow wasn't as present as I thought. So, I wondered what Skellige would look like if it had more snow. That's when I decided to push my shaders a little further by integrating a dynamic snow system with Nanite tessellation.
Composition
I always try to keep my composition as natural as possible, which is why I never do a blockout. Procedural actors like PCG or procedural foliage volume are my best friends for this. They allow me to propagate my vegetation very easily and, therefore, get a mood very quickly.
Then, I add relief to my terrain with the Landmass plugin. The aim isn't to create something perfect or realistic but some relief, enough to hide distant areas in a natural way.
And finally, I added rocks and cliffs on the slopes to increase the relief effect.
Modeling Workflow & the Assets
My workflow is standard if you have taken one of my recent courses, but for those who haven't or don't know me yet, here's how I organize my work when it comes to hybrid trees (structure in 3D/Nanite and foliage in traditional LOD).
Firstly, this scene allowed me to discover the new SpeedTree 10. Beyond the graphical overhaul, this version seems much more stable and ergonomic. Even if it still lacks the "improve folding" option we had in SpeedTree 8, this version looks very promising.
Concerning the trees, I start with the base of all trees, the trunk. My primary goal is not to have the final version but the shape I'm looking for. No details, no textures, nothing in depth, just the shape.
Next comes the first level of branches. Here again, the aim is not to work in detail but as a whole. Position, orientation, shape, and angle are all important to me at this stage.
From there, and depending on the tree being created, I either add other branch levels if necessary or proceed to create the 3D branch that will be used as a texture for my cutouts. Since the tree here doesn't require any more branches, let's move on to the 3D branch after adding texture to my structure.
Still on SpeedTree, I'm going to use the classic tools to create my branch. I start with a trunk, which will be the base of my branch, and various other levels, and finish by adding the needles. Again, these are branches on which I change the texture to add a color gradient. Once all these elements are in place, I push the details further by adding noise, tessellation, or various decorations such as Lump.
Satisfied with my branch, all that's left is to bake it, and SpeedTree has a great tool for this. Simply select the desired camera, in this case, the top view (XY plane), and press F10. A window opens, and you can choose which textures to bake. I keep everything by default, validate, select the folder, and wait for it to finish.
Usually, at this step, I should test the texture on my tree to make sure it's working and make adjustments if needed. But to speed up the explanation, let's move straight on to creating the atlas. The texture includes all the parts needed for my foliage.
As you can see, I have two large branches, six small parts, and six even smaller ones, all in dead-green versions. The positioning of the atlas is important, as it will have a big impact on the final resolution of your foliage. If the large branches are too small, your tree will look blurred.
Once my 3D branch is baked, I go back to my tree and add a branch level with no effect other than a little gravity. This will be my guide for my baked 3D branch texture.
Regarding the foliage, I start by creating a new material into which I add all the previously baked textures and begin cutting my cutouts. SpeedTree has a great tool for this, allowing you to create meshes quickly and in which it's possible to create LODs. Depending on the tree, creating cutouts may require more precision, so it's best to do it in a 3D modeler.
Back on the tree, I add a Fronds actor after my guide branch and add the material containing the cutouts to my Frond. All that remains is to convert my guide branch into a guide only by going to the Skin tab and selecting the Spine Only option.
To improve the density of my tree, I'm going to add anchor points to my cutouts to "grow" smaller parts on them. This technique is a very good way of achieving high density quickly. You must be careful, because it tends to highly increase the polycount.
When the tree is finished, I work on the LODs and the wind and remove the ambient occlusion. For the LODs, the cutouts are already done, but I still have to reduce the density of the tree, by choosing to make the actors attached to the anchor points disappear and make sure that the Fronds use all the LODs by making the "Mesh" blue curve as "Linear Decay."
Since I'm going to use the Distance Field, I choose not to generate an ambient occlusion on my tree. So, I just push all the settings at once. What's more, if it's stored in the vertex red channel, it's also baked into the base color by default. It is possible to remove this option by modifying SpeedTree's config files.
My tree is finished, and the workflow is complete. All that's left is to export my tree in .ST format and in two parts. First, the 3D structure (trunk and branches) in Highest Only to have only the LOD0 and then the 2D foliage in "LODs and Billboard."
Once on Unreal, I import my two actors, convert my structure to Nanite, and assign the material instances as required. To assemble my tree, I use a very simple blueprint with two static meshes, from which I create a "Blueprint Child" so that I only must change the trunk (BRK) and foliage (FLG).
Shader
The rock shader and the one dedicated to Megascans assets are available on my ArtStation. The real difference with this version of the shader is the coverage system, which supports Nanite tessellation.
To keep things simple and as all my shaders are linked, I work in "layers." This means that my workflow is the same as my terrain, which includes parameters, textures, and features.
I am using the Z axe to get the top of my assets. With this information, I mix two different shaders, and to make the system a bit more natural, I use a Perlin noise texture aligned on world coordinates. The Custom Height allows me to control the maximum height of the snow on the scene.
From here, the last thing to do is enable tessellation Nanite by modifying the config files and configuring the values in the material instance.
For vegetation, the approach is a little different, as I'm not using the Z axe. Instead, I'm using the red vertex channel to have real control over the amount of snow.
Composition
As mentioned above, I work a lot with procedural tools. For this scene, I used a PCG tool I originally developed for a previous course. I improved it to automatically detect the layer on which the actors are spawning to add a tree with or without snow. I also made it work with Megascans assets.
Lighting
My lighting is quite simple because it contains only a Directional Light, a Sky Atmosphere, a skylight with a white HDR, a post-process volume with a LUT, and a Volumetric Fog.
Summary
Between the idea, taking references, and the final scene, it took a month, but I only worked in my spare time. The main challenge was to remain consistent with the game while making it credible with today's technologies.
Many people keep their work and only show it at interviews, which I think is a shame. Feed your portfolio as much as you can because recruiters all start there, and for many, on ArtStation. So, if your portfolio isn't up to date, you know what you have to do.
For sources to recommend, I'll start with my courses, obviously, and sorry for the promo moment. It's a good place to start if you want to learn how to create vegetation, shaders, and scenes on UE5 or get your hands on SpeedTree.
Otherwise, on YouTube, I recommend the Unreal Sensei channel for keeping up to date with UE5, William Faucher for tools and tutorials, and Ben Cloward for shaders.