A long time ago in a galaxy far, far away…. or, in a small office/bedroom in the South West of the UK (depending on where you are in the Universe), I took a couple of weeks out of my busy current unemployment to focus on creating a few 3d assets. I wanted to keep it topical and within the time frame, so after the release of the new star wars film and video game I decided to make a Boba Fett diorama.
This tutorial takes you through a few examples of my texturing process for props and environment assets for my Diorama using Quixel’s nDo, zBrush, Substance Designer and Painter. I consider this work to be a good example of using non-destructive texturing techniques, and hopefully it can be of use to someone somewhere trying to achieve similar results or looking to improve their current workflow.
For those few of you that don’t know (shame on you!), Boba Fett was one of the most feared Bounty Hunter’s in the Galaxy. In the Return of the Jedi, he was thought to have been killed when inadvertently knocked into the Sarlacc pit by Hans Solo (now Hans Taken). So a small cut out of the side of the Sarlacc pit seemed the natural choice of environment for my diorama.
Ok, I’m going to drop the puns now and get on with the tutorial.
Episode IV – Normal Map Creation
After modelling the props from reference, I jumped in to Quixel Suite’s nDo, a neat little Photoshop plugin which converts selections into normal map information. Essentially I use this as an alternative to baking normal maps from a high poly mesh, which I find much more reliable, quicker, and more importantly editable to do in nDO for hard surface assets. If I want to go back and chamfer an edge more I can do it as easily as changing one setting on a layer in Photoshop, rather than editing an entire high poly mesh in zBrush or 3ds Max.
At this stage all I am looking to achieve is softening the edge normals so it looks like a higher poly mesh than it actually is, you can see in particular with the EE-3 Carbine Rifle that it gives the appearance of a much greater polycount. It also improves how the asset is lit because the edges have a shine along them rather than a hard edge, in real life there is no such thing as a completely hard edge. At this point I will also do normals for any small details that are not procedural, i.e – bolts, screws and grills, but prefer to leave any more generic surface normals such as noise or scratches until Substance Designer because it is easier to recycle that information into the albedo and roughness maps.
Substance Designer – An Introduction
If 3D art was the Universe in which Star Wars was set in, Substance Designer would be the ultimate jedi knight. It is a completely non-destructive node based procedural texture authoring tool, where you can composite texture information, much like you used to in photoshop and see the results in real-time. At any point you can go back and edit any of the information you put in to achieve instant amends to your textures. More cracks, less dust, fewer tiles, double the awesomeness, you name it and it can be done within a few clicks.
Substance Designer also has the ability to expose parameters to a .sbsar file, which can be imported into game engines such as Unity or Unreal 4. Your material, and all it’s properties you chose to expose, are completely under your control. For example, you could create a tile or cobblestone texture that you can edit the X/Y tiling, wear level, colour and pattern of without ever leaving the game engine. It is a brilliant piece of software and I cannot recommend it enough.
Here are a few examples of nodes that I use regularly, which I thought would be useful to anyone looking to learn Substance Designer and do not know where to start, it can be a little daunting if you are only used to layer based software… but trust me, it doesn’t take long to learn!
If you have any experience of any texturing, you will be familiar with blending modes. It works just like Photoshop and has all the common operations available. It takes in an input A and B and then performs a mathematical operation on each pixel, outputting a result you can continue to another node in your graph. It also has an optional mask input, you will see me use this node extensively during this tutorial.
It is important when texturing procedurally to use nodes that make it look less, well, procedural. Directional Warp does just this, it moves pixels from an input along an angle you define in the node by an amount defined by a second input. White pixels on the intensity input means the output pixel will move more, and black pixels mean they won’t move at all. This node is also really useful for creating marble, wood, or even rain drop patterns.
Slope blur is a very useful node, especially for creating broken edges in your height maps. It is basically another warp node but it warps the input image a lot of times based on the input image and the parameters you set. High samples and low intensity yields the best results here.
Gradient Map applies RGB colour to a black and white input, defined by a gradient that you create. Black input pixels will be coloured by the colours defined on the left side of your gradient, and white input pixels will be coloured by the colours on the right side. This is really useful for creating variation in your albedo map, sudden changes in colour can produce rippling colour through your texture, I recommend using it on your finished height map to get a good base albedo for any terrain textures.
Texturing Boba’s Helmet – Surface Detail
So I already have my edge normal map that I created in nDo, including bolts and grills, and now I am looking to add a little bit of surface detail to the paint found on most of the helmet to complete the normal map. The reason I do this before any other part of the texture is because I will reuse the information I create here when adding in roughness and albedo variation. The normal map is the most important map at the beginning and a putting work into it earlier means it will all be a lot easier further down the line.
There is not much surface information on the helmet so I thought it would be a good place to start as it uses most of the nodes I mentioned earlier. So in my ‘Paint’ graph I laid out a noise modifier, tiled it /2 using the Transformation 2D node, and then blended it over a grey colour node. The end map gets plugged in to a normal node which creates a normal map from a grayscale input (black gets indented, white extruded) based on an intensity parameter, and then this is combined with the imported nDo normal map using a Normal Combine node.
The next step is to add a few tiny cracks over the surface, which I achieve with a Cells 3 node and a couple of Directional Warp nodes. Like I mentioned earlier, the Directional Warp nodes are there to stop the cracks looking too uniform.
Finally I added in a few tiny holes over the model, using a Polygon node and another Directional Warp which I then feed into a Tile Random node which takes an input and generates a pattern from it based on a variety of parameters.
That was a nice gentle start to finishing off the surface detail on a normal map, and I haven’t committed to baking anything out of 3ds Max or zBrush that would be a pain to adjust. I know that if I need to go back and edit any of the information it would just take a few clicks in either nDo or Substance. Let’s give it some colour.
Texturing Boba’s Helmet – Albedo Variation
Creating an albedo here isn’t a whole lot different to what I have covered so far, I introduce a couple of new methods and also implement a few baked maps that were baked in Substance Designer. I also show you how to apply isolate different parts of the mesh so we can colour them differently.
Here is a method I use regularly when making a base for my albedo map. I lay down a colour node and plug in both inputs to a blend node set to ‘copy’ mode. I then link a HSL node on to one of them and plug in some procedural cloud noise into the mask slot. The HSL node allows me to tweak the Hue, Saturation, and Value of the input which in this case I made slightly lighter, creating a cloudy variation of colour. When I later expose that first colour parameter the HSL node will change relative to that colour, meaning if I changed the initial colour to red the HSL node will be a light red and not green, maintaining the variation.
Substance Designer has a great baker built in, it’s really fast and produces accurate reliable results. Right-click your imported model and hit ‘bake model information’ and you can bake just about anything you need. Here I apply a bit of lightening to the top of the helmet using World Space Normal and Ambient Occlusion baked maps plugged in to a Sun Bleach node, again using the HSL method to lighten the albedo around that area.
Finally I repeat the first method but this time with a finer BnW Spots node which I darker using an HSL node to get some darker areas of colour.
So this is my Paint graph finished for now, I go back and make a few tweaks eventually, mainly darkening the colour to match the reference I was working from, but all the base information stays the same throughout. I am not going to go through the rest of the material graphs I produced for the helmet, I used similar or identical techniques to produce the same results for the Metal, Inside, EarPiece, Black Plastic, Light and Mask graphs I use in the next step.
Now comes the fun part, combining all the graphs to apply the correct graphs to the right parts of the mesh. The key input here is having a ‘Colour ID’ map, which is plugged in to a Multi-Material node to handle the separation of information. A Colour ID map is used to generate a bunch of black and white masks that then in turn mask out the inputs, the advantage being that you only need one map rather than lots of individual black and white masks and multiple blend nodes. I do this in 3ds Max by assigned a multi-sub material and bake out the map using render to texture.
The result is all the information correctly applied to the right parts of the mesh! In the next part I go through the process of applying procedural wear to the model, as it all looks a bit clean at the moment.
Texturing Boba’s Helmet – Procedural Wear
The first thing I should mention here is that in order to achieve good procedural wear you need a lot of baked information. The first thing I do is lay out all my baked maps (World Space Normals, Curvature, Ambient Occlusion, Position, and a second Position on all axis).
I also lay out a lot of Color to Mask nodes, which are linked from the Colour ID map, in case I need to mask out any part of the mesh from a certain type of wear. For example I didn’t want a lot of wear on the black plastic attachment on top of the antenna, so I knew I would need to use a blend node and subtract this mask from the mask generated by the wear nodes.
It is important to think carefully at this point about what order to layer your wear nodes, start logically at the bottom and work up to the top like it would appear in real life.
The first node I applied was the Dirt node, found in the Mesh Adaptive section of the menu. It requires a Curvature, Ambient Occlusion, World Space Normals, and Position input to get the most accurate results. After tweaking the settings until I was happy, I then used three blend nodes (subtract) to mask out the metal and black plastic because I felt the effect was too heavy there.
I then applied a Paint Wear node which just requires an Ambient Occlusion and Curvature input, and achieves a kind of edge chipping on the paint around the edges, again I masked out some areas of the mesh where the effect was too much. I liked the look this gave around the red visor part.
Next, I laid out two Mask Builder nodes which really give a lot of possible grunge options. All the procedural nodes have a ‘random seed’ parameter which alters the generation when you change it, meaning that if you don’t like a certain pattern a procedural node is creating it can be tweaked until you are satisfied. I added the two masks together in a blend node with one set to a different random seed to double to coverage of grunge over the model.
Probably the only issue I have with Substance Designer is that it can LOOK quite complex sometimes. Admittedly when going back and creating these images for this tutorial, it took me a few minutes to remember why and what some nodes were doing! I would stress not to get put off or panic when trying to comprehend how a graph is laid out. I certainly did not start off with all these nodes in my head before putting them in, they are simply a series of individual operations that solve a problem. There are two Metal Edge Wear nodes combined (just like the previous Mask Builders), and they have masks applied to them which are isolating different parts of the mesh out from the effect, just like before, except more.
This is as far as I take the procedural wear. There comes a time with certain props where procedural wear just isn’t cutting it. You may be making something with a specific large detail in the texture, this is where it doesn’t make sense to try and tackle a problem in a procedural manner and you have to look elsewhere for a solution.
Meet Substance Painter. If you’ve never used it before then you have been looking in Alderaan places… (sorry, i’ll stop now). Remember all those years of working out where to place a texture in Photoshop to get it displayed correctly on the model? Now you can just paint directly on to your 3d model real-time!
Texturing Boba’s Helmet – Painted Wear
So again, the reason I have relied on Substance Painter here is because when looking at reference I noticed a few areas that didn’t look very procedural. Boba has a dent in his helmet and there needs to be some paint chipping around that area and a few other quite specific scratches on the right side of his helmet. Substance Designer is still my central ‘hub’ for the final texture, I am going to export a map out of Painter that I plug directly in to my Substance Designer graph.
Painter works in a more Photoshop-esque layer style, and doesn’t need too much explaining. You can create a layer and use different brushes similar to those you find in Photoshop, and you can also import your own alpha’s and create your own brush presets. However, instead of painting on to a 2D texture you paint directly on to your 3d mesh, so you don’t have to worry about where your uv seams end and the the next bit begins.. you can just paint freely!
All I did here was create a new layer and add a fill and a black mask. I painted on the black mask so I could export that mask out and use it in Substance Designer, the blue colour is just so I could see what I was painting more clearly. I used the dirt brush as well as one I made myself which just had a square alpha and a lot of random rotation, size and position jitter. I also imported a bunch of alpha’s I found online to help as well.
Once I had a few scratches down, I exported the mask by right-clicking and hitting ‘export mask to file’. I then linked this bitmap to Substance Designer and used it in the mask input of a blend node to see the result on my model.
Back to Painter for another layer, this time more harsh scratches that would be brighter than the last ones. I made a new layer again with a green fill and a black mask, and then painted another layer of scratches with the same brushes as before.
Same process here to get the mask in to Substance Designer, except I also add a Scratches Generator node and blend (add) it to my exported mask.
This was the final part of the graph in Substance Designer, I outputted my final bitmaps to Marmoset where I rendered out a series of images you can see below. I hope you enjoyed reading through how I textured the props, in the next part I go on to show how I made the terrain for the diorama.
Making the Terrain – Sculpting
I needed a small environment to house my Boba Fett props on, to make them look grounded and to help give them context. A good friend and ex-colleague of mine Gareth Knight had suggested that I placed the on the side of the Sarlacc pit as the location, so I did. Here I employed a different method of modelling to the props, as the terrain is more organic the nDo normal creation does not work as well, it’s better to bake your normal maps from a high poly mesh when working on an asset that is softer and more natural.
Zbrush is a very powerful piece of software, there are a ton of hugely impressive sculpts created in it and it is a fundamental tool in both the film and game industry. However, I still leave as many normal map details out of this part as possible, and use Substance Designer to finish the surface detail off with cracks, holes and noise. If I put these surface details in the zBrush sculpt and then decided later on they needed changing, it would be far harder than using Substance Designer.
I started with a sphere which I dynameshed to a low resolution of 32 and then, using the Move, Inflate and Smooth brushes, pulled and pushed the mesh out to a general blobby rock platform formation.
Once I was happy enough with the shape and formation, I used the Trim Dynamic brush to get the rocks I was looking for. I still used the move brush a lot here to pull out areas that had been knocked back too far by the Trim Dynamic brush or areas that just looked a bit wrong. Claytubes brush was used and then heavily smoothed on the sand to give some subtle height variation.
The finishing touches used the Crumple brush on the rock, a Standard brush to fit the terrain around the Sarlacc teeth connecting points, and a custom alpha (made in Substance!) for smaller rocks to break up the areas between rock and sand.
I used zRemesher to re-topologise my mesh down to about 9k polys. Polycount on this asset wasn’t overly important as the real game assets were the props placed on it, this was just something to help set the scene. I then unwrapped and exported both the high poly and optimised meshes to Substance Designer.
Making the Terrain – Texturing
Texturing the terrain employed many of the same methods I have covered above, so I won’t go through it in the same detail. I finished off the zbrush baked rock normal map with some cracks and holes, then made a sand graph with some noise in the normal. I then painted a mask in Painter where the sand would be applied and blended the two together.
I also painted a couple of extra details in Painter to help me, for example Painter has some really cool particles you can paint that take into account gravity and mesh angle. I used a few ‘Organic’ particles for the digestive tracts found clinging around the rocks, and I also painted the slight reddening around where the teeth join the rock and used a HSL node to tint the albedo red.
Further Application – Unreal 4
I thought it would be useful to show the application in a real-time game engine, to show the compatibility of the workflow between Substance and Unreal. This took no time at all to set up in Unreal, as all the hard work had been done. I can sleep well in the knowing that at any time I can go back and change almost anything about either the props or the terrain, and nothing would be too much of a problem.
So that’s the post over, IT’S A WRAAPPP!!! I hope it has been a useful read, and you can take away something about procedural texturing that you may be able to apply to something awesome you create..! Laters.