Ioana Santamarian talks about tips and tricks behind stylized environment creation (especially when drawing is not your strongest point) and explains how the hypnotizing dreamscape was created in Unreal Engine, Maya, and Substance.
My name is Ioana Santamarian and I am an Environment Artist, currently working at Polyart Studio, a company my partner and I founded a little over two years ago, with the intention of creating tools and assets for game developers. He handles the technical side and I handle the art side.
I do not have any formal art training, my background and education are in engineering, but after doing it as a hobby for several years, I felt confident and passionate enough to switch careers.
Working on Stylized Environments
I love stylized art, as it gives me the freedom to explore and experiment since you are not as constrained to the rules of reality as you would be when creating realistic scenes. So with this in mind, after a few early experiments, trying to develop my style, I found my footing with an open-world forest environment that was the culmination of everything I’ve learned so far and was very well received by our community.
So the purpose of this project was to see if I could push my art style further, fixing the mistakes from the previous one, while still maintaining the same overall aesthetic so the two environments could work well together.
As for references, my main inspiration for the theme was World of Warcraft and more specifically Mulgore. I just loved the rolling hills peppered with small groups of pines and surrounded by mountains.
After this, I created an asset list and started gathering references. I had a few distinct ones set up. An overall mood board with references for the final environment look and a few more specific ones: Textures, Foliage, Ruins & Stones.
I used PureRef, which is just a brilliant way to sort out your references, and these days it’s become indispensable for my workflow.
Creating the Composition
I wanted some gently rolling hills surrounded by steep mountains. Since the purpose of this was not just for a still shot, it was for a playable level, there were a few key set pieces that I really wanted to see and built the level around them.
- Grassy hills with a few pine trees sparsely populating the area;
- An area with ancient ruins at the bottom of a cliff;
- A small forested island;
- A deep redwood-inspired forest with tall trees, blocking out most of the sun;
- An eerie Stonehenge-like altar, deep in the forest.
Once I had this loose idea of several connected pieces in my head, I went to Gaea to start experimenting with a terrain. Gaea is a neat little program that’s similar to World Machine, but I find it easier to use and I can quickly iterate terrains until I get something I’m happy with. For my actual terrain, it's a very simple setup as you can see, just 2 nodes.
I then imported the terrain into Unreal Engine and started to fly around it and see if it was a good match for what I wanted to do. I then took a screenshot and made some very rough zones for each area I wanted to make.
Drawing is not my strong point, so I avoid drawing whenever I can and usually limit myself to very rough sketches. In this case, it was something like this.
I marked the important areas and then discarded the parts of the terrain I felt weren’t needed for performance reasons. Any sections you couldn’t see from the valley were removed. For the terrain material, I created a master terrain material for the previous project and I used it here as well.
The master material is pretty standard. It features an angle-based slope blending layer that blends between 3 textures based on the angle of the slope. In my case, I use grass, dirt, and cliff textures. There are more complex auto-materials out there, but for stylized environments, a lot of time, less is more, and too many layers and textures create a lot of noise, which distracts from the aesthetic.
For the cliff texture, I used a triplanar projection material function to remove stretching on very steep cliffs.
In addition to that, it also features 7 paintable layers and it reduces the UV tiling amount of the terrain textures based on the distance to reduce repetition.
Creating the Assets
All the assets for the project were created from scratch. I’ve used Maya, ZBrush, and the Substance Suite for this project. Historically I used either Photoshop or Substance Painter for texturing, but I have been studying Substance Designer in my spare time and I wanted this project to be the first one where I use Substance Designer in a production environment. All the tileable and foliage textures were created from scratch in Substance Designer. While it has a higher initial time cost, it allowed me to iterate quickly and make changes on the fly, so it ended up saving me quite a bit of time in the long run! So Substance Designer is here to stay in my workflow from now on.
Working on the Foliage
For this environment, I wanted a different approach to creating trees. Instead of sculpting the trunk manually in ZBrush and baking the details, I chose to make low poly models and use tiling textures instead. This removed the need to sculpt and bake, but the tiling trunk texture needed to look great. I created the trunk texture in Substance Designer using a few different warped shapes and then using a tile sampler to try different configurations.
Started from a polygon and warped and blended different variations of it
Second shape uses the same concept but a different base
Final trunk texture
For the pine leaves, I wanted to make it simple, but still, keep the needles that conifer leaves usually have. I first created a simple thick needle and then just used the Transform and Blend nodes to place them into position.
I then took the result, cleaned it up a bit, and made 3 different leaf clumps in Photoshop. I could have done this directly in Substance Designer as well, but it was much quicker in Photoshop.
I then moved on to Maya. I created a basic tree trunk and a small branch, unwrapped them both, and applied the tiling texture. When working with tiling textures you need to do some planning on how you will unwrap your meshes since you want it to look seamless. I created a few different leaf clumps with special care to make them look “fluffy” since a lot of pine trees end up having very flat-looking leaves, which I wanted to avoid. I then started assembling the trees.
The soft selection tool is your friend here since pine trees become narrower with height so you can scale the leaves using soft selection to get a nice smooth transition.
The other trees were made in a similar fashion, with the tall ones having a few more details on the trunk and a few branches with clumps of leaves being added for a bit more variation and extra detail.
The grass and flower textures were created in Substance Designer as well, with the meshes being simple planes. The grass blades were simple enough, with thin and long shapes, scaled and warped and blended together, with a gradient applied at the end.
Using Directional Warp and blending between blades
The finalized grass texture variants plus opacity masks
I wanted the grass to be low poly, but still, give the impression of volume and a high density, so I ended up using grass planes, but instead of making them straight, I slightly deformed them in several directions. I’ve also edited the normals so they point upwards to get the correct shading for grass. Jess Hider’s blog is a great resource on the topic.
For the flowers, Splatter Circular is your friend, allowing you to turn any shapes into something resembling flowers.
Creating some basic shapes and using splatter circular gives you a clean result
Ended up using three distinct flower types
The flowers inside Unreal Engine
Runtime Virtual Texturing
One of the most difficult parts of making grass is making it blend seamlessly with the ground. I saw people use RVT and get amazing results, so I figured I would give it a shot. In a nutshell, RVT allows you to save the shading information of a certain actor (most commonly used with terrains) using the GPU inside an asset, and then access that information inside of a material.
In my specific case, I wanted to save the color information from my terrain so I could use it inside my grass texture to lerp vertically between the terrain color and my grass color, thus achieving a seamless transition from terrain to grass.
This is inside my terrain material where I plug the BaseColor, Roughness, Normal, and WorldHeight values into the RVT Output so they will get stored:
This is where I take the BaseColor and lerp between it and my regular grass color using a linear gradient as Alpha:
Scattering the Foliage
For the tree scattering, I chose to use the foliage painting tool in order to have more control over the look and feel of the scene. For the trees specifically, I checked the foliage collision so they don’t overlap and just started painting the terrain with a large but low-intensity brush.
I started with the large trees and created the forest, then used the smaller ones to fill the gaps. For the rest, I tried to place down small relatively dense groups of trees, with plenty of open terrain between them to achieve the Mulgore look.
For the grass and flowers, I used the grass system from Unreal Engine. You can use it to place grass on the terrain automatically based on a mask. I used the grass part of the auto-terrain material plus the paintable grass layer as a mask, so the grass will spawn everywhere there is a grass texture on the terrain.
The grass output node can have multiple grass types with multiple masks
Adding the Wind Effect
For the trees, a SimpleGrassWind node was added to the World Position Offset with some customizable parameters. For the grass, I wanted something different. I wanted to achieve occasional bursts of wind, followed by moments of calm, which is more akin to how grass behaves normally.
I created a Cloud Noise mask in Substance Designer and with a Panner node, used it to mask the Vertex Position Offset. The dark areas really pushed the grass to the ground, while the white areas kept it straight. I used the same texture with two different tiling settings and blended them together to get some more variety.
Lighting was overall straightforward. I used a Directional Light as the Sun and a Skylight for ambient lighting. I tried to get the color just right for a sunny afternoon, lots of yellows and some ambient pinks from the Skylight.
The main thing to consider when lighting very large environments is the performance cost, especially shadowing. I used standard Cascade shadows close to the camera but I used Distance Field Soft shadows in the distance to get soft far shadows with little performance impact.
As for post-processing, I tend to prefer a more intense Ambient Occlusion to increase self-shadowing on foliage, giving it more volume, a subtle Depth of Field to reduce background noise, and some basic color correction to increase saturation and contrast, to give it a more vivid look.
The biggest overall challenge during production was getting the look of the trees finalized. I knew I wanted to give them more volume, compared to most stylized representations of pine trees, but I also needed to keep the polycount down, since they are meant to be used in open-world scenes.
I ended up spending probably a week until I made the first tree that I really liked. Once that one was finalized, the others were finished in just a few days. As a more concrete example, getting the look of the trunk texture just right took a lot of experimentation in Substance Designer. Sometimes it looked great when previewing it, but as soon as I added it on the trunk mesh I knew it wouldn’t work.
Some of the different attempts that I didn’t end up using
My advice to stylized environment artists is to try to find your own style and always push yourself further. Stylized art offers you a high degree of freedom since you are not constrained by the rules of reality and you can do so much with just a few basic shapes and colors. Always start simple and gradually build from there, layering in additional shapes and details where needed.
Thanks for getting to the end, this was a pretty long article! I hope you found it useful. And if are curious and want to see more and get access to all the models, materials, and scenes, you can check out the complete environment here.