Jonathan Johnson talked about the production of his 3D environment inspired by Chateau Guillard and Paris maps from Overwatch: use of trim sheets, texturing in Substance Designer, modeling in Maya, and final setup in UE4.
In case you missed it
You might find these articles interesting
In my final years of school, I knew I wanted to be in the video game industry but didn’t really know what I wanted to be yet. I started thinking of being a concept artist and naturally found myself doing environment art. I am not sure why I started 3D modeling but I knew that I loved creating environments and in recent years I've had a huge appreciation for the environment art we are getting out of games this generation.
Overwatch Fan Art Piece: Gathering Reference
I’ve always wanted to do an Overwatch piece. I'd started one in the past but wasn’t really happy with it. Recently, around February/March, I started playing the game again and thought: why not try again to create an Overwatch scene. One of the things that I wanted to do was to see how much I could texture using trim sheets. I knew about them and how to make them beforehand but the Trim Texture Tutorial Series by Tim Simpson - Polygon Academy definitely helped me to understand the process more.
To gather references, I started by making a custom game in Overwatch itself and just flying around, getting up and close to textures and assets, and taking screenshots. I also had the game running while making assets and textures so I could quickly go back and forth. I first looked at the Chateau Guillard map because I liked the look of that map and wondered if I could replicate the style. When I started the project it was going to be very small but then it got a lot bigger in the process and because of that, I added in the Paris map for references as well.
Goals to Achieve
The parts that I wanted to address the most were things like colours, lighting, and the look of some of the assets. The main objective was to create textures that closely resembled the reference material. I thought about the look of the normal maps and the amount of detail the bricks would need in order to try and replicate the stylized look for the walls and floors.
Here is a trim sheet that I used for some stone details throughout the scene. This was used on the centre stone structure as well as parts of the roof and the stone balcony in front of the windows.
For those who are not familiar with it, a trim sheet is a highly reusable texture. It is a bunch of textures laid out side-by-side inside one bitmap that can have tileable and non-tileable sections. You use a trim sheet to efficiently texture meshes and also save up on memory when creating environments. You can also swap out trim sheets and as long as they share the same layout you can get a different look of an object.
The first thing I usually work on when making any facet of a piece is the textures. Doing my textures first allows me to better focus and prioritize what I want to do which lets me work much more efficiently and at a faster pace when I get to modeling. For the textures, I was mainly focusing on using trim sheets. It helped to make them first, - or at least the main trim sheet first, - before modeling so that when it came down to UVing the assets I could already put the textures on the objects and get them straight into the engine.
For texturing, everything was made in Substance Designer. The only object I textured in Painter was a candle and that was to make a gradient for the emissive. I have a custom Designer graph that I use.
I use the base material for a quick and easy way to update the maps in the viewport. I also have a packed map that follows the same way for export from Painter as for the Unreal Engine export preset which is AO in the Red channel, Roughness in the Green, metallic in Blue, and height in the Alpha.
A lot of the parts of my workflow in Designer are picked up from tutorials I’ve watched in the past, for example, working in greyscale going from big to small shapes and then inputting them into the normal, AO, and base material nodes. I start making the height map, then go to the colour map, and from the colour, I use a greyscale conversion to start on the roughness. Then, if some tweaks in the Normal or AO are needed or if I need to make a different height map like I did for the floor slabs, I will do that after I have made the roughness map.
Here is a breakdown of how I created the floor slabs. This is the overall graph:
The bricks start as a square shape that goes through an edge detect to get rounded edges which then goes into a bevel. From there, I use a slope blur to get some edge details. For the slope input in the slope blur, I blur the clouds; that way, it doesn’t give a noisy effect which is something we want to avoid. Lastly, that goes into a tile generator which changes the size, offset, and luminance range.
For the slab edges, I'm running what came from the tile gen, plugging that into an edge detect to a flood fill, and running that into a flood fill gradient. I blend them using the Min(Darken) on the blend node. One thing that I did was plug the blended gradients and the flood fill into a distance; that way, it got rid of the gaps that were created with the edge detect. I use the histogram scan to only get the edges of the slabs and blend them onto the main graph using multiply; this gives me nice stylized edge damage.
The cracks for the slabs started out very simple but went through a number of changes which makes them look great in the final texture.
For this, I'm using a tile sampler that goes into a distance and then into an edge detect to flood fill. The flood fill is going into the flood fill gradient which I change the way the gradient is going as well as add variation. I blend them all together using the Min(Darken) in the blend node. I invert and use levels for the cracks and then blend them back into the main graph.
So after I have gathered my references I load up Maya, import the Unreal mannequin, and base everything off of that. Here’s how I prep all my settings to be ready to work on modeling:
Firstly, I set my world units in Maya to centimetres and change my grid size to Length and Width = 1000, Grid Lines = 100, and Subdivisions = 1. When modeling, I will always model on the grid to be as modular as possible. That way I'm not set into a specific area size or one giant mesh, for example, and I feel there's a lot more flexibility for being modular.
To begin, I create a 400cm plane which is usually my ground plane. I also use this to test how textures look and how vertex painting will work in the engine. From there, I usually work on the walls and get a basic shape for them (the dimensions I usually use are 400cm in width and height; I'm not too bothered about depth but I usually set that to around 50-100cm). From there, I will work on large major shapes or assets going from big to small. For this scene, that included the walls and floor. Before I start making other assets, I import the walls and floor into Unreal so that I can start planning out the level (how wide, long, or high it will be, etc.). From there, I just go through the assets, again from big to small. For this scene, after creating the walls, I began making the wooden structures, then plant pots, the centre stone circle with the tree, and then other assets to populate the scene.
For modeling the tree, I used Maya Paint Effect I learned about from a tutorial by Tyler Smith on Foliage Tree Creation in Maya and ZBrush. I would highly recommend looking at that tutorial if you want to see how to make trees within Maya.
So, I select a tree base that I will paint in the viewport and start changing its parameters to see what kind of tree shapes I can get.
Once I’ve gotten the tree base, I start creating the leaves. For the leaves, I first make the texture within Substance Designer, then bring that into Maya and apply it to a plane. I then cut it up and start to shape it, adding a curvature to the mesh. From that, I then start to create a simple leaf clump that I can place around a sphere to create a bush shape. To help with this, I installed a plugin called spPaint3D which helps with placing objects onto other objects. With it, I can set a min and max size or rotation, otherwise, I would have had to do that by hand. This tool lets you paint across an object or hand place it, - which I did but I didn’t have to worry about going back to rotate or change the scale of it.
I also do this for the tree leaves, however, I placed them onto a sphere that I have changed the shape of. After I placed them, I selected the underside leaves and moved them up a bit to get a more flat underside.
The most challenging/complex part of creating this scene was making the foliage look good. My first attempt turned out okay but after sharing the initial pass I got some feedback that it looked a bit flat and that I should add some bed to help alleviate the problem (or at least make it harder to notice). Another challenge I encountered was UVing each object. I had to get out of the mindset that every object had to be unwrapped in 0-1 space. Since I was using trim sheets, UVs would frequently go out of that space.
One thing I want to touch upon is how I created the Vertex Height Blend in the engine.
This is what the Master Material looks like.
For the Master Material, I have a set of textures, one for the bricks and one for the leaf ground. I also have a TextCoord node with which I can change the size of each set of textures, for example, I can make the bricks bigger or smaller compared to what the leaf ground is. I also added in a heightLerpWithTwoHeightMaps node which allowed me to have 0, 1, or an in-between value for the blending so I could have either full bricks or full leaf ground or an in-between result that took into account the height maps.
Here's what the height maps for both textures looked like:
Basically, the black parts get blended first, and then the whites.
The lighting started out pretty boring, with just a plain white light for the sun. Early on in the development of the scene, I decided to put an orange tint to the light which added visual interest to the scene; I also tried the lighting with orange foliage. For the lightmass settings, I used the same values that Tim Simpson used in his video about lighting in UE4:
I used these settings as a base but ended up changing the Environment Intensity and Diffuse Intensity. I also changed the environment colour under the Lightmass Settings to a bit of lighter orange.
When I build my lighting I set the quality to medium which allows the lighting to build quickly. This was helpful when I wanted to check out the changes to the levels. Once the work was complete, I set the lighting quality to production for the final render.
For the final touches, I added some decals and particles for the leaves falling from the tree. The decals were a clump of leaves and a drain around the centre stone structure with the tree. The clumps were added to simply put more leaves on the ground without having to vertex paint them. The drain was added to make the scene more believable.
For the leaf particles, I used an Orbit node which gives a nice rotating movement to the falling leaves.