Creating a Snowy Landscape in UE4: Terrain and Organic Shaders

Maria Ardinceva prepared a detailed breakdown of her UE4 environment Snowy Ruins: terrain creation and mountains, material setup, vegetation, lighting, and more.

Introduction

My name is Maria Ardinceva. I am a self-taught 3D artist based in Moscow, Russia. I’ve been doing graphic design for some time but decided to switch to game art several years ago. Last year I landed my first gigs and occasional freelance jobs, which were mostly about architecture and working with Unreal Engine. This gave me a huge opportunity to learn and eventually realize that environment art inspires me the most and it is exactly what I want to practice from now on.

1 of 7

Snowy Ruins: About the Project

This project started off as an October challenge in the DiNusty Empire community. We were tasked to create a complete environment from start to finish in one month and were also free to choose any theme we like, but something manageable so it can be completed in time. I had this idea of a snowy scene for some time in my head, so I decided to join in. This was definitely the coolest decision made recently – challenges are super motivating, especially if you are to work on something complex and need to stay concentrated and productive for a long period of time. 

References and Blockout

I knew I wanted to make a snowy environment, heavily vegetated, with some man-made structures. I didn't have any particular idea or concept in mind though, so I spent a couple of days on Pinterest grabbing references and setting up a nice board to work with. The main ones were put together in a PureRef file and I also gathered some additional material on my Pinterest board. Those were concept art pictures, images of architectural elements, walls, large structures, ornaments, plants I wanted to create, ground textures, and some in-game screenshots I found useful. 

As for the blockout, the process was fairly simple. I started to block the whole scene in Maya, working mostly with cubes to get the basic idea about the position and scale of the main objects. One I was happy with that, I moved to a more detailed block of the walls and towers and also added blocky pines and simple stones. The big tower was supposed to be the main focal point of the scene, the small one was more of a detail. Once the main props were modeled to a certain point, I exported all the meshes to Unreal, applied a very simple material for a colour blockout, and established a basic lighting setup by adding Skydome, Skylight, Directional light, and Exponential fog to a scene. I still needed to add mountains to the background and start working on the landscape which I did shortly after.

Landscape

For terrain creation, I used Unreal’s landscape system. Basically, there are several methods for that: you can import a heightmap made previously in, say, WorldMachine (this was my first idea) or you can create your own terrain using a wide variety of in-engine sculpting tools. As I’ve said I wanted to try to generate a heightmap for snow hills instead of hand sculpting, but I fast realized that doing it manually will be a way more flexible option. The first thing I did here was set up a Cine Camera Actor; I found a nice camera angle and started sketching out basic landscape shapes and positioning blockout meshes. Actually, there’s not much to say about sculpting itself, all tools are quite self-explanatory. Probably the only thing I can add here is my use of alphas with terrain sculpting. In this case, I used a heightmap from a mountain mesh I created in WorldMachine, stored in a blue channel of a splat map. It gave me some height noise and variations although I don’t think it was all that noticeable with tessellated material in the final result.

For me, the most interesting and challenging part was definitely the landscape shader. I haven’t created one before, so had to do tons of research and learning and not stretch out timing too much. While at the reference stage, I already knew that the ground shader should have at least two materials, snow and grass. So I started from there and created those two in Substance Designer. A bit later I added another layer to the shader – a rough snow to blend with the base snow and give it some natural transition (technically, it was the same snow material, just with some extra height information in it).
The shader itself is basically a three layers blend based on the height of the layer stacked below. I also added a camera distance based tessellation option to it and a couple of tweaks for roughness and height using Lerp node. For specular, I used the red channel information (in my case it’s roughness) multiplied and contrasted to get those speckles you can see in close-up shots. I added some major tweaks for subsurface colour using Fresnel node in order to get a gradient mask and therefore add an extra depth to the whole snow SSS effect. The same subsurface information was plugged into the grass layer as well (you can see that the material has those little snow spots in between the grass blades). I stored the mask for those spots in the alpha channel of a grass albedo map and used it for blending. To be honest, I’m sure that in my case this was total overkill and the effect could be seen only at a very short distance, but for the sake of learning and practice, I left those be. Also, there’s a very simple water/wetness layer added, it is basically a layer with flat normal and high roughness values, nothing more to that.

For those who want to learn more about the topic or who are struggling with their first landscape shader, here’s a list of resources that I personally found extremely helpful:

Mountains

Once I finished with the landscape, the next step was decorating the background of my scene with mountains. Those were supposed to be very natural looking meshes with believable texturing, so hand-sculpting was not an option for me. And here’s where procedural heightmap generation came in handy. 

WorldMachine is my personal software of choice, but I believe the same concept applies to any other programs out there. If anyone wants to get a close look at how it works and what it’s actually about, I highly recommend the course Introduction to World Machine by Peter Sekula. As for the mountains, the whole process can be split into three major steps: 

  • Generating heightmap, making necessary adjustments for masks, combining those masks into one splat map, outputting mesh and the splat map. All that can be done entirely in WorldMachine. 
  • Importing the obj file of the mountain into ZBrush for decimation. Once decimated, you can use the result as a low poly mesh and bake a normal map on it. 
  • The last step is setting up a blend material in UE4, using the splat map as masks.
My graph is quite basic and short. I used Voronoi noise with an Easy Distortion node to break up the shape and get a nice natural flow of rock formations. Then I clamped the values using the ‘Find Extents’ option (basically, this works like Auto Levels), expanded the height a bit, and ran the result through a channeled erosion with simple filtering. The only thing left was to clamp the ground down, leaving mountains high, so I combined a constant value (something low, 123 m in my case) with the erosion result using a mask (low values from a heightfield). This was my final height map, very simple and fast. The thing that took me most of the time was finding the right values for Voronoi noise, something that best suited me. The next step was to combine masks into a splat map for texturing. In my particular example, I used only two of them, one for cliff and the other for soil (flow map). The blue channel was supposed to store a mask for snow peaks, but I used a different approach for snow and decided to put a heightmap there instead (I eventually used it for landscape sculpting as an alpha). 
Now that my masks were set and ready, I imported the ‘mesh output’ from WorldMachine into ZBrush and decimated it until it hit something around 3k triangles. This was my final low poly mountain used in the scene. Then baked a normal map, applied one single polygroup to it, and exported everything into UE4.
And finally, the last step was to create a master material for the mesh. The material itself is quite simple, basically, I blend four layers of textures (grass, cliff, soil, and snow) on top of each other using my premade splat map. 

Grass is a base layer, then goes cliff layer, then soil, and on top of that – snow. I haven’t created any mask for snow, because I wanted a bit of control over the total amount of texture covering the mountain. So I ended up using a technique from Lukas Koelz mentioned earlier found in this video:

I also used it for snow covering the props and vegetation with maybe some slight adjustments. 
To minimize the usage of texture samples I stored a roughness map in the alpha channel of an albedo map. For specular, I took the red channel from the final base colour blend and added some tweaks to it. Also, I created SSS for snow based on a WorldAlignedBlend mask in a similar way I did for the landscape. 

Materials, Shaders, and Vegetation

For texture creation, I used several different methods. I utilized Substance Designer quite extensively, got my first experience sculpting tileable textures in ZBrush and baking maps in SpeedTree, and used FiberMesh for both grass and needles creation.

1 of 4

Grass, bark, and two variations of snow were all done in Substance Designer. The stone wall texture was fully sculpted and was my favourite to work on. Since I watched this tutorial by Dannie Carlone, I was eager to try this more traditional hand-sculpted approach. I believe there’s something unique about textures made entirely in ZBrush and I really wish to sculpt more of those in the future. 

For the bricks blockout I went for a slightly different approach than Dannie showed. There’s a really nice video that explains how to set up an Array Mesh properly and not bother yourself with constantly offsetting border parts of a sculpt:

To get various masks for texturing, I applied polygroups as polypaint on a high poly mesh and baked a vertex color map from it. In Substance Designer, making it greyscale and using a Histogram Select node gave me all sorts of mask variations for texturing.

The rest of the vegetation textures were also made in ZBrush with the Fiber Mesh technique for needles/grass blades and polypainting which is something I took away from the Vegetation & Plants for Games course with Jeremy Huxley. The whole concept of creating plants includes a high poly sculpting (or generating in my case), polypainting it by hand, and making final adjustments and map exporting in Substance Designer. The only thing I do a bit differently is texture baking from sculpts: instead of grabdoccing those straight in ZBrush, I prefer to bake them in Marmoset Toolbag and have nice high-quality AO and opacity maps to work with. 

1 of 2

The Substance Designer pass for all of my plants is quite similar to the stone wall texture I made earlier. Although almost all of the base colour was done in ZBrush, I mixed some bits of the curvature and AO into the final textures, also applying variations to the albedo from polypaint the same way I did with the stones.

The approach I used for vegetation in SpeedTree was completely new to me. For shrubs, using the bark texture created earlier I made a cluster for a branch, randomized it, and set up a plant in basically no time.  

This tutorial has full in-depth information on how to set up clusters and bake texture maps straight in SpeedTree, it really helped a lot and saved me time:

To save more time, trees, grass, and shrubs were all assembled in SpeedTree. The program provides an enormous amount of features I’ve yet to learn properly, but it’s definitely very friendly for the first time studying. Exploring blank templates and their official YouTube channel both helped with a basic understanding of how things work and were my main guide.
The shader I created for foliage resembles the one I used for props. I started with a material function, this one was made specifically for a SpeedTree foliage setup and has various controls for tint, roughness, specular, world position offset, and so on. The most interesting one here is probably an emissive, I like to add a small amount of ambiance to fronds with it.
The rest of the shader including snow covering was assembled the exact same way as in the case of mountains. I made a function for snow layering which was also used in the props shader and blended it with the foliage function. The only problem here was that the blend didn’t respect the opacity from foliage, so I had to come up with a little workaround multiplying foliage and blending opacity maps and overriding the result in the final output with a SetMaterialAttributes node. 
1 of 2

Props

All props and man-made structures were hand sculpted, baked, and textured in Substance Designer. My initial idea included a lot more of those – I wanted to create some columns and a lot more variations of stone piles but eventually had to stick to a reasonable number of assets to make it in time. 

Sculpting was also very fast, with the main goal to get a nice readable shape. Since most of my assets were supposed to be heavily covered with snow and seen mostly from a long distance, I didn’t want to noodle around the sculpting phase for too long. The shapes themselves have a very strong Mayan influence which is kind of strange to be seen in a snowy environment but I like it. Both buildings have ornaments on side pillars. Those were premade black&white images imported in ZBrush as alphas and applied using a combination of MorphTarget and a stencil technique:

There was a lot of reuse in this project. For all of the props and buildings texturing, I used the same base colour node setup as in the stone wall texture. All I had to do is swap the bake maps and make some individual tweaks. The same can be said about props shader – there I utilized the same technique and a snow function like in the foliage setup.
It still felt like there was something missing, some sort of detail, so I made a very simple snow pile and clumps meshes and decorated all of the buildings’ corners and flat surfaces with those. Pixel Depth Offset and the DitherTemporalAA node made the transition smooth and natural.

Lighting

The lighting is entirely movable and raytraced. The whole setup is based on four main actors: Directional Light, Skylight, Exponential Fog, and Skydome mesh. There are also a lot of cameras, each for a single shot that I found most appealing. 

Skydome is basically a sphere, you can make your own in any 3D package or use an existing sphere from Unreal. It encompasses the scene and holds a sky HDRI texture on it. Here’s an example of my Skydome material.

The whole lighting heavily relies on the HDRI image. I used one single picture for Skydome and Skylight for more physical accuracy. I also experimented with fog a lot, exaggerating it, playing around the inscattering option (with that same HDRI), using volumetric fog, increasing Volumetric Scattering intensity in the Directional Light properties. In the end, I settled with these tweaks:

I really enjoyed working with the Cine Camera Actor during this project. It has some nice sliders for Depth of Field allowing to get an effect just by eyedropping the pin or (which I preferred the most) using the Draw Debug Focus plane control. 

In the camera, I also enabled some Ray Tracing options. The main one for me was RT Global Illumination. An interesting option to experiment with was an Ambient Cubemap texture using an HDRI image (same as before) with some low-intensity values. 

I did not use many post-process effects here. Most of the base colour grading was done in Photoshop and saved as a LUT texture. Basically, it’s just some slight curve and vibrance adjustments. On top of that, I added a post-process sharpening filter material. Here’s a nice tutorial on how to make one:

Finally, I really want to encourage everyone to have a look at the tutorial by Joe Garth you can find below. He demonstrates step-by-step how he assembles an incredibly beautiful scene with Megascans and talks about lights, meshes, and post-process.

Conclusion

This project turned out very fun to do, the whole experience was very versatile and I got a chance to work on different tasks at once and expand my knowledge. I should admit that participating in challenges is always a good idea, it did work for me personally and I definitely want to do more in the future.

I know that I am still learning myself these days, this is why I wanted to add as much information, screenshots, and resources as I could. I really hope some of you will find this breakdown useful. 

And again, I wanted to thank 80.lv for reaching out to me and giving me this opportunity to share my work.

Maria Ardinceva, Environment artist

Interview conducted by Arti Sergeev

Keep reading

You may find this article interesting

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more