3d artist Tristan Meere showed how he creates amazing procedural materials with Substance Designer and adapts them to game environments.
3d artist Tristan Meere showed how he creates amazing procedural materials with Substance Designer and aapts them to game environments.
My name is Tristan Meere, I am currently working as an Environment Artist at Velan Studios in Troy, NY. I grew up on a farm and spend most of my childhood drawing comics and making knock off Pokemon cards. I first attended school at Rochester Institute of Technology pursuing a degree in Game Design & Development where I took an affinity towards graphics programming before adjusting my career towards digital art.
Most of my art education comes from other artists giving back to the community and sharing technique. Places like Polycount, Youtube, and especially sites like this have been absolutely invaluable in my growth. I also had the incredible opportunity to mentor under three very talented developers, Warren Spector, Joshua Howard, and David Cohen on leadership and management for 9 months. Those months really helped inform my perspective on teams, culture and my impact on them. It was a pretty self-reflective journey and gave me an appreciation for the amount of effort that it takes to create a positive and high performing team and studio culture. Most recently I studied material authoring under Joshua Lynch, which for me has been a turning point in the way I think about materials and more specifically how I approach building a graph in Designer to work in an intelligent manner.
When I started really getting into digital art was right around the time that PBR was entering the game development scene. It was during that GDC, 2014 I believe, that I first met Sebastian and Allegorithmic and was immediately hooked on the software; Substance Designer 4. I think what fascinated me initially and what draws me to it now are a bit different. Initially material work was almost an easier route to getting the kind of artistic satisfaction that we all desire to feel. What fascinates me now the most about materials is the micro narrative you can tell within a larger environmental story of a scene. Every knick, scrape, discoloration or bird footprint in the sand tells us something about the world without being explicit and it does it all within a few TGA files.
Using Substance Designer
Working in Designer for me has been one of the most artistically freeing processes for material development. Designer is kind of like solving a loose puzzle, it rewards exploration and intelligent design of graphs. I’ll often times find myself just playing around and discovering new methods of arriving at a desired effect, it is a really rewarding experience to just kinda go with the flow and see what you produce. Non-destructive workflow is one of the biggest positives of the software, environments and games aren’t the sum of their parts, so having the ability to make adjustments with little production cost is really powerful.
Designer is also really great at producing variety, a single graph could contain several types of materials all in one.
Going into the Rocky Ground material I knew that I venturing into the unknown in my experience and it would require a fair amount of learning and iteration to get to a satisfactory state. I knew from the get go that I wanted each aspect of the material to be able to stand on its own and to have the graph setup in a way that I could easily modulate between any of the elements. I think organic materials can benefit a lot by having a ton of variety built into it, simply because the entropy of nature.
The material was made up of a few different elements, namely; dirt, rocks, and grass. I spend a ton of time researching the real-life versions of each of the elements and how they looked combined together. I also tend to reference games and other artists quite a lot when I do my research, for Designer specifically it helps sometimes to get a sense of how someone else accomplished a similar effect. Namely for the rocks I learned a ton from Chris Hodgson’s interview with Allegorithmic, that helped me start to understand the process that it takes to create rocks and laid the groundwork for the initial blockout of the height.
When I first start with a material, especially if it is complex with multiple elements I tend to create the entire skeleton before fleshing out the individual components. If the material contains blended elements then part of creating the skeleton is setting up the blends and really nailing how I imagine the elements blending together, that helps alleviate headaches in the future. I always start with the height map, that is most important structure in the graph because it provides the data for the entire material. My setup early on will only have the Height, Normal, and a draft AO pass so that I can get the best sense of how shapes read. It is also super useful to work on the roughness before you work on the albedo for simple reason that it is WAY easier to get a good read on the roughness without all of the albedo cluttering up the view.
I also knew that I needed to create grass, blended arbitrarily around the rocks. For that I knew that the tile sampler was the best bet because it allows you to input a mask so it will only place the inputted image where the mask is white, that way it eliminates any weird clipping.
The biggest thing I try and do for any material is to create smart node structure. I think of it as common ancestry, where you can trace your outputs back through the nodes until you end up at a common base which contains the breadth of controls. For example, by adjusting the Mask Random in the tile sampler I can add or remove grass from the Rocky Ground material, everything that makes up the height of the grass is the common ancestor so if I adjust the masking in the tile sampler then that feeds all of the other nodes down the line, so everything else adjusts. This makes quick adjustments a breeze and I think in a production situation would be pretty invaluable for look development of an environment.
For the rocks I knew that I needed to find a solution to create a field of unique looking rocks. The approach that I decided to take was to create a layer of rock that I could modulate the height and have the highest peaks stick through the dirt, giving very unique shapes and significantly easier controls for varying them. One of the methods I used to create a more naturally worn look to the rocks was the peak & valley smoothing method I used on a previous snow material. That allows you to modulate how smooth the peaks or valleys are, which create a softer and more aged look. Using this at high opacities will start to destroy surface details so I tend to do this step before I start blending in details and at mid to lower opacities. I follow the chain of blends by large to small shapes and give them less and less intensity as I travel down the chain, until I get to ultra-fine details which are blended in at very low opacity. It’s important to control noise levels in your height and normal maps, I use the roughness and albedo to really showcase small and fine details. A general rule I follow is that large, and medium shapes look great in the height and normal, but small and high frequency detail needs to be less intense since they can really start to mess up the look of a material.
For the dirt I started pretty simple but I knew that it needed to push the shape and depth to make it stand out, rather than just being filler. This meant adding in more small details like twigs and pebbles, both of which used pretty much the same method, tile sampler an inputted image and blend into the dirt using lighten. The stones are just from a stone generator node that I built and use pretty often whenever I need generic pebbles. The hardest part about the dirt was giving it the right amount of noise, I find that having variation in the noise level really helps sell the lived in feel, which I true for pretty much everything in art. I subtly and breakup goes a long way, having many different noise passes added in small amounts will give you a much more natural look.
The vegetation proved to be pretty difficult to create, I think part of it came from inexperience but I also think that Designer does start to struggle a bit when trying to create entirely procedural vegetation. The grass itself was just a simple blade with a gradient inputted into multiple different splatter circular nodes and then those inputted into tile samplers. In order to get it looking more like grass I came upon a few discoveries. Firstly, it should smooth out the height and normal, it shouldn’t have a harsh edge to it. I also found that by making all of the blades point in the same general direction that it created an optical illusion that at certain angles caused the grass to read much more 3D. In order to get the blend of the height correct I needed to get the places in the dirt where I was blending the grass in to be a more uniform value so it would blend evenly, simply masking a blurred version of the dirt was the easiest way. The grassТs height value was put through a low pass filter, giving it a really soft height, this was then blended into the dirt using lighten with a mask to make sure there was no bleeding.
For the water I discovered a pretty cool trick for blending the water using lighten and getting the exact mask out of it. If you blend lighten a uniform color into the height of your material, it will blend a flat height into the lowest points, creating the pooling effect of water. If you adjust the uniform color it will adjust the height of the water. I used the color to mask node to find the the same value that the uniform color is, so it will always give me the correct mask. In order to get it to work you need to expose a parameter for the uniform color’s Output Color, give it a name like waterHeight. Then in the Color To Mask, create an empty function for the color parameter and create a graph similar to the one shown below.
I think having an abundance of surface types is really awesome depending on the type of material, the more organic you get the more I think I’d sway in favor of creating more robust, multi-purpose graphs. In the case of making something like rocky, grassy, dirty ground, it has so many individual elements that I think it is prudent to create a powerful graph which can give you a ton of variation. If you’ve setup your material to really support variation like that then you’ve both future proofed yourself for changes but also opened up more options for blending and breakup.
Even in man made materials that I’ve created I think I’ve always leaned more towards variation, I think it comes as a given in some senses because of how I build my graphs. I try to have them mimic the real world as close as possible, so if I want to tear up roofing tiles, it will automatically work to show the tiles underneath because I made sure when I put the tiles in they were the correct length. I don’t think it is lack of vision so much as art not being an exact science and having the ability to make adjustments easily just makes sense to me.
To display my materials I pretty much only use Marmoset Toolbag, it is a really invaluable tool to check on the finished look quickly. I like to render it on planes and cylinders, I know a lot of people use a lot of different shapes. I think it’s good to show off different shapes, the plane gives you a sense of how it might look in a game on a flat or relatively flat surface. Showing it off on a cylinder or other 3D shape is a great way to show off both the heightmap read but also how the material looks at an angle.
Adapting for Environment
When I am creating materials for an environment it’s important to frequently look at your material in your target engine/renderer, just so you catch things that might go wrong early on, and things will go wrong. The benefit of something like Designer though is that even if you get to the end of the material go to render it and find that you’ve done a dumb, you can easily just go back to the graph and adjust it. Tiling is a really big issue that you have to look out for, it’s really easy to create something that is obviously tiling if you only ever look at it on 1x tiling. So just adjust the tiling, you can do it in Designer while you’re working on it. You can also view the tiling in the 2D window by pressing spacebar, I use that frequently to just check myself as I build a graph.
As far as taking it into an engine or renderer, it depends on where you are going because everyone has a slightly different interpretation of PBR and they all have their own quirks. Generally, if I am building a scene in Unreal 4 I will import the SBSAR files into Unreal and use that to generate different textures, it’s a pretty painless process and just helps eliminate having to jump between software when you’re in the building phase of a scene.