Half a year ago, I graduated from the University of Arts (HKU) in the Netherlands with a degree in Game Art. In my second year at the university, I was focusing on Environment Art, which brought me to an internship at Turtleneck Studios. It was an exciting time to work on Rite of Ilk and seeing the incredible art Turtleneck's team and previous interns had made. In my spare time, I started to experiment with Substance Designer. Eventually, I got fascinated by it and used the software in my graduation project Baroque Bedroom.
With that Baroque environment, I was able to explore a wide range of techniques to create a varied amount of detailed ornate textures. With my portfolio, I was lucky to have several interviews with a number of studios and land my first job in the game industry at Yager.
Skyblivion is a volunteer-based project by the TESRenewal modding group consisting of around 40 developers. They are bringing the Elder Scrolls IV: Oblivion to a new generation of gamers and re-introduce it to long-time fans of the series. You can check out their awesome work on their website or follow them on Twitter, Facebook or Discord!
When I was approached by one of the directors, I really loved the passion the team showed for the project. As I was moving to Berlin, I didn’t have much time to help them out with some materials. But when I did have a chance to work on this side project in my spare time, it felt really refreshing to dive into creating materials again.
General Structure of the Materials
When I joined the project I was asked to recreate some of the textures for Anvil. The direction the team wanted to take was slightly different from the original. Newly created concept art showed the city with a more Mediterranean feel. In order to match the concept, I looked at cities like Turkey, Italy, and Greece where buildings were made of a much warmer sandstone material.
The original texture library for Anvil consists of a variety of stone patterns. Recreating all texture from scratch would be very time-consuming, so I decided to create sub-graphs (or I sometimes call them generators) which will shape any given pattern into rocks. This allowed me to more quickly create a variety of materials based on the same parent material.
I broke down the textures into different sections. For this texture set, it was clear that all of them shared the same rock structure. After all, you want to have a consistent look in the sandstone as these rocks would be gathered from surrounding areas and will be seen all over the city.
Secondly, I separated the Mortar graph. Personally, I found it useful to separate graphs per material type. This way it will still allow for usage with other sub-graphs. We can for example use the mortar together with another brick generator.
The last subgraph is Moss, which looks at the given height map and distributes patches of moss across the surface. Adding some vegetation to the materials, tells us more about the biome it is located in. Warmer climates tend to have drier plants and less growth, but you might see some tiny plants in crevices or on shadowed pathways. Using the parameters from the subgraphs it is easier to quickly iterate on this.
The Rockshape graph takes any given pattern and sculpts it into a rock. All features in the graph are exposed, which allows for easy iteration. Down here, I explained some of these features for the creation of the Heightmap.
Shaping the rocks
The first step is to get some depth in each individual rock. I do this by blending Flood Fill to Gradient nodes at different angles. After that, I cap the high peaks and blend in a Cells1 noise to tweak the shape a bit more. This adds some randomness to the overall surface.
One of my favorite nodes in Substance Designer is the Slope Blur. It helps to add some nice wear and tear to the edges of the rocks. When you use the Slope Blur on a Noise node (such as Clouds 2) and input a blurred version of itself, you can get some nice slope variations. Blend both of them together to make them appear more damaged.
For the cracks, I used a distance node on some scattered squares and used an Edge Detect to select the lines. After that, use a SlopeBlur and multiply them with the previous Height.
One of the cool things about Sandstone is that it is a Sedimentary rock, which means that it is formed by other particles (in this case sand). Therefore, you can see smaller rocks or layers on the surface.
Rock Lines progression:
To recreate this effect, I used a TileGenerator to scatter some directional lines. In order to curve them on each individual rock, you can use a Non-Uniform Directional Warp node. In the Intensity Input, use a Perlin Noise at Scale 2 and a Directional Warp from the Flood Fill to Random Grayscale. For the Angle Input, use that same Flood Fill to Random Grayscale node. After that, use a Warp node and blend it again with the same Random Grayscale node which you plug into a Gradient Map to derive some color variation.
For a bit more wear on the rocks, I added some Lichen. These were shaped using multiple Splatter Circular nodes using some warped circles.
And at the end, there are some final adjustments, such as a curve to edit the slope of the rocks. You can also subtract some of the smaller rocks or add some random depth to each of them.
The Mortar graph is simpler than the previous subgraph. Here, I use the heightmap to decide where the mortar will be added. Overall, this graph uses a variety of similar techniques as in the Rockshape graph, except for a mask for some Leaks that I created at the end.
For the Mortar, I wanted to add some features which allow the rocks to blend better. Some of the mortar might be damaged and some sand might have landed on the top of some of the rocks. Furthermore, I added the option to add some water leaks. This is especially helpful for locations that are damper or for a wall that has water damage.
Mortar graph features:
Below is a breakdown of the Mortar graph just in case.
By blending a Clouds 2 and Clouds 1 node I managed to get a good amount of surface definition for the base mortar. Again, I utilize the same trick where I use the Slope Blur on itself to get a more ‘blocky’ feel, rather than the blurry noise.
After that, I used a Splatter Circular to spawn some dots which I both add and subtract from the base, to simulate from smaller rocks within the mortar. And finally, I remove the inner part of the rocks, to make sure I will only get the mortar on the edges.
To create some cracks, I used the Tile Sampler with a pyramid shape. After that, I used the same technique as with the rocks, where I blend a variation of Flood Fill to Gradient nodes at different angles.
By using a HeightBlend node I combine the Mortar and Rocks together. After that, I subtracted some crevices generated from a Shadows node.
For the Leaks, I used the built-in Leak generator combined with a Directional Blur. Again to make the leaks follow the shape of the rocks I used a Warp node and a Blurred version of the current heightmap.
To help ground the materials in their biomes, I decided to add some vegetation (in this case moss) to the material. In this graph, I first create a heightmap for a clump of moss, which I then scatter on top of a given height map using the Tile Sampler node. To decide where the moss should be placed, I masked the G-channel of the Normal map and selected only the pixels that face up. Then I use the Warp node with a blurred version of the original Heightmap to warp the moss around the edges of the rocks. This gives it slightly more depth.
Adding Distinctive Details
To make these materials shine, I tried to implement different features that define where the material is located and how it has aged. For example, the variation I created for the rock wall is located in a more inland, damp environment. The moss is much more present and vibrant here, there are some water stains and the rocks have a much colder hue.
When creating the sub-graphs or main graphs, it is, therefore, important to think about what values you want to expose so that others can quickly alter the look of the material. This look can tell the viewer where this material is located within the world (be it a Mediterranean harbor, dark castle or a swamp) and what kind of purpose it has (a wall will have a tighter gap between each rock and some will have sand blended on the top from the mortar, while floor tiles can be more scattered around, have a lower height variation and be more smooth since people have walked on it).
When I started to learn how to procedurally craft materials in Substance Designer, it took me some time to get used to it. It requires a specific mindset where you have to learn how you can create certain ideas.
For me, creating and implementing procedural materials works a bit like a puzzle. Note that there is no correct way of achieving something, as there are always multiple solutions to whatever you want to get.
If you want to get into material production, my advice would be to experiment a lot. Be inspired by tons of amazing artists out there and learn from their breakdowns and tutorials (this is where I learned a lot of tricks and techniques to achieve certain goals). And have fun doing it, this will help you create work that feels more personal.
Thank you for reading and if you have any questions feel free to contact me on Artstation.