Rafael Serralheiro returns to 80 Level to tell us more about the Audumla Land project, discuss the material creation process, and share the lighting setup.
In case you missed it
You may find these articles interesting
Introduction
Hello, I am Rafael Serralheiro, an Environment Art student at Gnomon School focusing on Environment Creation for Games. Audumla Land is an original concept heavily inspired by the God of War universe in tribute to the excellent game and the inspiration it has given me.
Historically, Audumla was a cow who fed Mother Nature in the Viking culture. This symbol is associated with fertility and Life. In this piece, Audumla is dead for a long time. So are its surroundings, stormed by chaos, war, and the cold breeze of these mountains.
I hope you find this article helpful for your workflow since I will be breaking down some aspects of creating this specific environment using tools like Unreal Engine, Gaea, and Houdini.
Blockout
When starting the project, I was unsure what I wanted to create. I had different Concept art in my collections and different aspects I wanted to grab from each one. I started to develop multiple block-outs to help me define what the final image would look like. I also started by organizing and creating a pureref to accommodate all my art bible, references, etc. I have created a template that I would love to share with you all. Nothing fancy but useful.
I tried to do as many different iterations as possible with simple meshes during the block-out stage. I firmly believe that the faster we fail, the quicker we will achieve the final and better result. I did three different iterations of the scene and was not convinced by any of them. So, I approached it differently. I knew I wanted the scene to feel big and spacious. I also wanted to learn a terrain workflow using Unreal. So, I decided to jump to Gaea to build my terrain and constrain my scene to a specific terrain.
Terrain Creation and Unreal Material Setup
To create my terrain, I used Gaea. Gaea allows the creation of a terrain using nodes workflow and is relatively intuitive to understand. The goal with the terrain was to get sharp and pointy mountains in the scene. So, in a matter of nodes, I had a terrain I was happy with. Gaea is great not only for creating mesh terrains but also for texturing. I used the software to create masks for where I would want my materials to be. These masks came in handy when setting up the scene inside Unreal Engine.
Once happy with the terrain and mask textures, it was time to export it. Gaea has a couple of different ways you can get the terrain out. The first one, by using a node called Mesher, that will export the terrain mesh out as a .obj or .fbx. The second method is by exporting a Height Map. In my case, I exported a height map from Gaea and used it inside Unreal.
When working between Gaea and Unreal Engine, there is a partial translation between what is displayed in Gaea and Unreal, but it is not exact. Also, when exporting the maps, keeping the map size the same as the Unreal engine landscape size is essential. Unreal Engine has great documentation about this topic if you want to explore this further. But ensure that your landscape has the exact same dimensions in Unreal Engine and Gaea. In my case, the Height Map was 1009x1009.
Then, I imported the height map to my Landscape inside Unreal Engine and adjusted the scene to ensure the terrain was above the Unreal grid. Once the terrain was in place, I started exploring different shots and locations from which to build my scene. When I found it, before jumping to place different objects in the scene, I started by drawing a stick figure over the camera lens to understand better where things would go. This has helped me shape the work for the future since the final compositions kept a lot of the initial placement.
In the above picture, you can see the top drawing being the one I quickly planned, and below is the iteration right after, with some objects in place and trying to match the overall idea.
Now it was time to set up a Landscape Material for the terrain. You can use your tillable materials, megascans, or just simple colors to begin with. In my case, I created some textures using Substance 3D Designer that I then used for my scene.
To begin the set up of a Landscape Master Material, I started by:
1. Creating a Distance Mask that allowed me to control the amount of Normal Intensity, Tiling, etc., based on the camera position. This came in handy to avoid tilling issues and better sell the look and feel of the textures at certain distances.
2. Then I created Material Functions for all the existing materials I was going to use in my landscape. In this project, I used 4 Material Layers: one for the Rock, one for a Rock Variation, one for soil, and lastly for snow.
3. The next step was to create a master material to combine the previous work. By dragging the Material Functions into the Master Material and blending them with Blend Material Attribute, we get everything properly connected. However, to paint textures on top of each other and still respect the Height Map of all of them, we need to use a Height Lerp node. Another important point is to connect a LandScape Layer sample into the Height Lerp Transition phase to plug the Masks from Gaea into them and get an overall area of the textures we desire.
4. Finally, I created a Material Instance from the Master Material and Plug that into the landscape.
Once the Material part was created, I imported the Masks created in Gaea in the Landscape Section. These Mask files do not need to be inside Unreal Engine. Then, after importing the masks, the layers will show up automatically on the Paint menu. However, sometimes, the Landscape material is buggy. If, for some reason, the layers do not show up or need an update, the best way I found was to Create a “dummy” material (Empty Material), apply it to the Landscape, and then reapply the correct Material instance. Unreal updates the UI once the Material is applied to the Landscape.
The image below shows these steps in more detail to give you a visual understanding of what I have just explained.
To make it more clear in the video below I show, how the Distance Mask came in handy to control some intensities or tilling:
Displacement in Unreal
This part is totally optional if you are creating a scene like this one. But I wanted to try and get used to the Unreal Engine technology for Nanite. In order to make this available, I went to (Project Folder/Config /Default Engine) inside the Default Engine, I opened it as a note file. Then under: Script/Engine.RenderSettings, I inserted these two lines of code:
- r.Nanite.AllowTessellation=1
- r.Nanite.Tessellation=1
When you re-open your project, Unreal will probably recompile some of the shaders in order to make Nanite available.
Inside Unreal Engine, in the Master Material – Material Attributes, you will have a new option for displacement. The material will use the displacement on the LandScape by connecting the height map to the displacement. The downside to this approach is that the displacement values must be changed in the Master Material, and it is usually not easy to see an update in real-time. This is because once we applied the displacements and changed the settings in the material, we needed to reconstruct the data in the Landscape to get a better result. Again, it just takes a few tweaks before getting a good result. For Audumla Land, I used displacement for two of my four landscape materials.
Kit Creation, Tilible Texturing, Plants, Set Dress Props
With the Landscape Material in place and the tilling textures created, it was time to create the kit pieces and refine textures.
This scene was enjoyable to work on since I have made a lot of hand-sculpted assets to fit the Viking world. Most of the kit was created using Maya for an overall block-out mesh, and then in ZBrush, where most of the magic happened, the models went from blocks to real objects.
Since most of the scene was natural and hand-crafted objects, a lot of time was spent in ZBrush getting the high, low poly. Maya was used for the UVs and Substance 3D Painter for Baking and Mask Creation.
If you are curious about any of the specific techniques I have used to get these assets, I have done another 80 Level article where I go more in-depth about my process to create these assets. For this project, I used mostly the same process. A few things I did differently for this scene were trying to get smaller kit pieces and get more mileage out of my props. A rock, with 6 different sides can be used as 6 different rocks. At this stage I also started creating some assets that would help me blend my environment even better, with snow piles and clumps, adding some realism to the scene and making it more cohesive.
In addition, in this Environment, I created some foliage using SpeedTree. I needed to create some pines and small dead/frozen plants. Inside SpeedTree I created a pine utilizing a combination of trunk, branches, and foliage cards. I used the Megascans atlas for the pine leaves for time purposes. For the small grass, I started with a leaf and played around with orientation, scattering, and fall off to get a small clump of dead grass. The great thing about using SpeedTree with Unreal is a seamless workflow. I was able to import the wind generated in SpeedTree over to Unreal. The image below explains how I achieved this.
Then in Unreal, once I got the tree in the scene, for the wind created in SpeedTree I created a WindDirectionalSource. That way the wind settings I had in SpeedTree were transferred to Unreal.
Houdini and Unreal Engine Workflow – Snowtopper
As I mentioned before, one of the early concerns when creating this environment was that snow is challenging to create and blend properly.
I would have been able to create a unique snow geo, using Maya and ZBrush to create a snow topper to help me blend the scene. However, this workflow would have taken me a long time to complete. So my friend and fantastic Pipeline/Tool Artist Nathan Vandevoort created using Houdini a tool that allowed me to select geometry inside Unreal Engine and easily send those pieces to Houdini and get a Snowtopper geometry based on the selected mesh. Here is Nathan talking about his process and how he created this Tool.
Nathan Vandevoort: Hello! My name is Nathan Vandevoort and I’m a student along with Rafael specializing in pipeline and tool development. Creating this snow tool was a lot of fun, and I’m excited to share the problem-solving process. This tool runs in Unreal via Houdini Engine. This allowed me to quickly ‘sketch’ out this tool allowing me to turn around a working version in only a few hours. The steps the tool takes to generate snow are as follows:
1. Receive incoming geometry from Unreal engine and iterate over each geo by its unreal_actor_path attribute;
2. Use the bounds of each iteration to create a square grid of points with Number of Samples divisions on each axis;
3. Position and orient this grid according to the user-specified Snow Direction control;
4. I project the points along the snow direction vector and cull all points which do not collide with the target iteration’s geometry OR do collide with the other geometry that I use as occlusion objects;
5. I also cull points based on their dot product between their hit normal and the Snow Direction control based on a Snow Level control. This allows for easy adjustment of the amount of snow;
6. Then I have each point sample the number of points near it and can use this sort of as a snow density mask. I delete all the points that have a density that is too low to get rid of random degenerate bits;
7. I also use this density mask along with the user-specified snow scale parameter to adjust the scale of the snow. This gives a nice scale falloff near the edges of snow clumps;
8. The above steps iterate for each input geometry as said above. This ensures that each piece of geometry is given an even projection of points no matter the scale.
9. I then scatter metaballs to each of those sampled points and mesh them according to a user-specified Resolution. I give the user a Retopologize checkbox to allow for automatic retopologizing. I then project some UVs and call it a day.
10. The meshing step is the most resource-intensive part of the process so I gave the user a Preview Mode option that shows the sample points as they are. This allows the user to adjust the parameters in near real-time.
I would like to thank Rafael for the opportunity to work on this. I learned a whole lot about geometry sampling techniques and Houdini Engine in Unreal. If I were to create this tool again I would attempt to do it entirely in Unreal with either Blueprints or C++ which would make the tool much more performant.
Rafael Serralheiro: I used Nathan's Tool extensively in this scene and found it such a great asset to have on my tool kit. The tool helped me to enhance various elements, such as rocks and props and allowed me to achieve different results for snow with its scale, variation, resolution, and mesh options. The tool also provided me with mesh optimization, which helped the scene run smoothly. I have included a video below to show me using the tool on different pieces:
Unreal Textures Layers and World Align Z
In Unreal Engine, I am a big fan of using Material Layers. In my previous article, I explained how I created my Material Layers Setup. However, I decided to break it down further in this project and add some extra information. Let's start by showing my process step by step. First, let's look at all the necessary pieces to create this setup. In the image below, I have explained in five simple steps all that is necessary to make a Material Layer.
1. Create a Material Layer. When creating a Material in Unreal, make sure to select Material Layer. This is the Material where you will connect all your texture maps to the correct slots and expose parameters like normal intensity, roughness, and many more. Below is an example of a Material Layer I created for this Scene.
2. Create a Material Layer Instance. This allows us to get more materials and easily switch the texture maps. This method is incredibly efficient in case you need to change or add a specific attribute to the Material graph and do it in only one instead of many Material Layers. By instancing one Material Layer, all the other Materials will automatically update once the first is changed.
3. Create Material Layer Blends. These are extremely powerful since they allow you to create any blend. Since I was creating a scene with snow, I wanted my texture always to have a snow texture covering only the top of the geometry. For that, I created a Material Layer blend that would blend the top layer of my material by using the World Align Z. In addition to that, I had an extra Blend Layer for RGB and mask blending. These two were enough for this scene, but you can be creative and create any blend you might need. The image below showcases both Material Blends I created for this specific scene. Again, it's nothing too complicated but effective.
Also, this video quickly showcases how objects react to the World Align Z in the engine:
4. Create the Master Material. This material will receive any extra baked maps, such as Normal Maps.
5. Instance the Master Material. Again, by instancing Materials from just one Master, allows us to change and update the master and get those changes across all of the instances. The image below shows how I have set up my Master Material and a look into the Material Instance, inside the Layer Parameter.
Besides Material Layers, here are some extra tips I wanted to share. For this scene, I used a detailed normal map to get more refined and crisp noise in some of my textures. This worked very well on my rocks and snow. I applied this Detailed Normal Map on my Material Layer. Here is a comparison of the same objects with the detailed normal off and on.
Lastly, I used dither in my snow textures to get a clearer and smoother transition. This allowed me to get a soft fall off from the geometry to the edge. This is a straightforward setup, and I encourage using it for different materials like snow, sand, or moss. Or any geometry that will serve as a skirt. Below are some images to compare the results of the dither once used in the scene.
Final Polish and Cleanup
This was the scene with what I have explained so far. All the models are textured and in place, with an overall look and composition. However, at this stage, it was important to get back to the reference board and push the scene towards what I envisioned at the beginning.
At this stage, I like to get a strong to pass to my lighting, blend the scenes even better with smaller props and skirts, as well as correct any value issue or roughness value. These steps will take the scene from average to great. This is what I usually work on at this point in the scene:
- Light the Scene
- Set Dress with Smaller props
- Correct Base Colors and Roughness Maps
- Composition Clean up
- Extra details with plug-ins.
Light
Regarding lighting, I wanted the sunlight to come from behind the ribs and cross the composition from left to right. However, exterior lighting is taught to art direct, but still possible. To achieve my lighting, I created a directional light as my sun, an HDR backdrop to work as a secondary light source, and then I used multiple point lights and spotlights to achieve a more pleasing look. For reference here is the scene only with the Directional Light and the HDR Backdrop:
Notice that the overall scene is too dark. The problem with this light setup was that my main points of interest needed to be highlighted the way I wanted, and most of the work I created was getting darkened by the landscape shadow. So, to avoid that and get more out of the scene, I had to hand-place extra lights to get the look I was looking for. In addition, to get a stronger god rays effect, as if the light was getting covered by clouds, I added these giant cubes with an opacity mask connected to get more variation in the light, as you can see in the image below:
To conclude this section on lighting, here is the scene with all the smaller lights:
Value Correction
On this topic, I will be brief, but the most important thing to remember when getting close to finish is to check the base color and roughness values. This can ensure that no color is too saturated or contrasting too much. The same goes for roughness values, ensuring nothing is too black or white but in a mid-range according to the surface. Snow was challenging because it was a very reflective surface. But in my scene, I decided not to push it too much; otherwise, the snow would look and feel off. You can check these visualization modes inside Unreal Viewport by changing the view mode.
Plug-Ins
To conclude this scene, I ended up using some plug-ins I highly recommend getting them on your tool belt. I used fog cards in this scene to get my distant clouds and fog, using EasyFog by William Faucher. Then, I used Sky Creator by Dmitry Karpukhin for snowfalling, a super powerful light plug-in for exterior scenes with straightforward controls and adjustments. And, to conclude Background Birds.
With EasyFog, I achieved some cheap and dynamic clouds in the background. Just by hand placing cards on the scene and trying to respect the terrain flow to get some interesting shapes. Here is the scene with no fog cards and Fog cards.
Then, I used Sky Creator for the snow and weather FX. Sky Creator is a fantastic lighting tool, but I was not getting the right look for this specific environment. So, I ended up only using it for the snow. However, I found it hard to understand how I could only get the snow from Sky Creator. So here is a tip. To get Sky Creator to only show you the snow or any other weather FX, turn off all the other settings under the details panel. Here is how you do it:
For this scene, I hid and checked off Visible on everything except the Weather Effects. Since I already had my light set up correctly, I didn't want the Sky Creator to conflict with my Light Rig. In the end, this was the final look of the scene. Combining all the steps I have explained before.
Conclusion
To conclude this article, I would like to thank all the amazing artists who gave me feedback and many ideas to improve this scene. I also want to thank Anton Napierala, who supervised and guided me in this environment, and Jon Arellano for all the feedback, guidance, and patience. Also, thank Nathan for participating in this article and creating a tool for which I am incredibly grateful. And Arti Burton, thank you for allowing me to share my breakdown and workflow for this scene.
In addition, if you want to learn more about the Viking culture and art, I would recommend a couple of books and websites. For Viking art, I highly recommend checking Jonas Lau Markussen. Jonas has an amazing book and website where you can read more about different time periods of Viking art, and from where I took inspiration for the engravings. If you want more historical information on this wonderful culture, I recommend checking Sea of Wolves, and The Viking World.
If you want to get to know more about Nathan's work, check his portfolio and LinkedIn.
You can reach me on IG, ArtStation, and LinkedIn. I would love to connect and get to know if this was helpful to you!