In case you missed it
You might find it interesting
Hello, my name is Hugo, I am a 4th year Art game student at Rubika Supinfogame in the north of France. The only company I worked for was Appeal Studio in Belgium during a two-month internship last summer, which made me realize that I wanted to be a material artist. I am available for an internship next summer, so don't hesitate to contact me!
Working in Substance Designer
I discovered Substance Designer in the second year by listening to students from the upper years, who told me that it was a magical software, so I decided to try it out with YouTube tutorials like many other people. Since I am not very comfortable with 2D graphics, this kind of software was a universe where I could express myself. The Substance Designer community is special to me because it is very easy to share your work, your workflow, all you need is a screen of your graph, a "node combo" to explain how to add small veins on leaves or how this brick can change its shape, for example. So everyone quickly shares their work, and this project is an example of it. I’ve been inspired by many artists, looking at their Arstation profiles, breakdowns, buying and analyzing materials, reading articles... this is what allowed me to progress, and make the project interesting! So if I have some advice for everyone who wants to get into Substance Designer: get inspired by the work of others, their workflows and combine these to create your own workflow and fully express yourself!
Working on the Elements
First of all, there is a very important point of Civilization 6 that I absolutely wanted to respect, the game is based on a hexagonal-tile system, each building, each unit is built and moves on a hexagonal tile.
This was the first and one of the biggest challenges of this project.
First of all, the basic hexagons of Substance Designer fit into a square, and therefore it does not tile exactly: they are deformed, and I had to solve the problem.
I found a YouTube video that explains this problem and shows how to solve it by creating a function in the tiling parameter of the tile generator and in the interface parameters x/y of the tile generator.
I suggest you check the video in question if you have a similar problem.
I could now create a hexagonal tiling and change the number of tiles without any deformation.
I decided to organize myself as follows: A general subgraph, where I group and mix all the elements I need, and subgraphs, where I create each element independently with exposed parameters.
For the mountains, which have been a big challenge, I first thought of creating unique shapes that I will place on the hexagonal tiles, but the Civilization 6 mountains extend over several squares and create a mountain range.
As I said earlier, I was directly inspired by Emrecan Çubukçu's work because the base of his mountains was very interesting.
But it didn't fit perfectly to me because the mountains of Civilization 6 are stylized, so I modified them accordingly.
I start from a cross shape that I tile before plugging in a Distance Node with noise to create an interesting base.
Then, I use a similar method to as Emrecan Cubukcu for the mountains, he explains it very well in the following article.
Finally, to create this marked edge that creates the mountain range, I start from a polygon tile sampler that I flood fill to create a gradient and the mountainsides.
Finally, I mix the two and then I mix it again on itself with ambient occlusion to reinforce the sharp effect of the mountains.
It is very important to work permanently with references: open on the PuRef and keep it open right next to your graph.
For trees, for example, I noticed that the shape was separated into several "starts".
So, I started from a simple shape that I shrunk and juxtaposed to create the heightmap, then, thanks to a simple parameter I was able to create 4 variations that I added in a tile generator. The whole thing is colored with a simple gradient map.
I then noticed that there were dirt and stones near the trees, so I created simple stones in a subgraph with exposed warp parameters to create variants that I then included in a splatter shape; so I also exposed the parameters to create variants.
Thanks to the basic mask of the trees, which I subtract the trees, I can easily place stones and add the ground.
It is very important to expose simple parameters of your subgraphs to create variants.
Before I talk about water, I would first like to talk about the Fog of War, which was a big challenge and was important to me.
In Civilization 6, there is a fog of war that is important for the gameplay, and I wanted to transcribe that into the texture with a procedural fog that adapts to the terrain, whose size and shape could be adjusted.
For the mask of the fog, I created a simple noise with a base shape and a warp that I tile in a sample, I then contrast it to the maximum and, finally, I vector it and then morph it to a flow map to give the worn, burnt effect of the map.
So for the color of the fog, I simply vary color according to a cloud mask, then I add in low opacity with input the color of the map.
Then for the tracing effect of the old map, I create an input of the heightmap and play with ambient occlusion. I had the heightmap in a quantize node, then I take out an ambient occlusion and merge the two ambient occlusions, and I had a good base!
Then for the water of the fog, I take out the height map of the water that I use as a mask between two colors, and then I add it to the base color, so no matter what the configuration of the map is the fog always adapts itself.
I also created wave patterns, which are placed in the water mask to add this old-map effect also presented in civilization 6:
For the water, I was inspired by an 80 level article by the wonderful Zahar Scherbov who made a breakdown on his Mediterranean Water Material.
I based myself entirely on his material because I had no idea how to make convincing water, and I invite you to go and see this article, which is very interesting. I then adapted it to my project by integrating my water mask, it was necessary that the foam is deposited on the edges of the coasts, and for that, I simply invert the mask that I subtracted from it to create a border that I then warp and which serves as a mask for the foam.
I quickly added waves on the normal water to break the repetition of the ocean tiling.
I also recovered the mask of the foam that I enlarged to obtain the mask for the sand surrounding the water.
For the parameters, they all come from particular nodes in the main graph but also in subgraphs.
For the basic biomes, most of the parameters come from the random masks of the tile generators, which themselves generate the biome masks, the biome masks are then added one on top of the other, so that the biomes do not overlap, and the water mask takes priority over all the other masks to make it easier.
The main problem is the following: "how to make the mask understand and define itself according to a hexagonal tiling? " and that's where my best friend intervenes during this project : FloodFill and the grayscale flood fill, which allows me to input a noise, for example, and the grayscale flood fill will interpret this noise as a mask but according to the hexagonal tiling.
Then, thanks to a simple parameter like the disorder of noise, I could generate the water mask, which is at the base a simple Perlin noise with a histogram scan.
Many of the parameters exposed are simple Perlin noises, histograms or amounts on x and y of a tile sampler (trees, for example). For this kind of project, I advise you to tidy up your nodes as quickly as possible, to classify them and to break them down as much as possible, so you will be not lost like I was!
I had a lot of trouble organizing myself, given the complexity of the project.
There is no secret in this project, it all works simply, thanks to its masks that are intimately linked, it's a kind of big headache, where you have to go slowly and test every time you add a feature.
For the city:
I generated two small buildings starting from a simple shape that I blend
For the colors, I used one of the basic set. In order to make the windows appear, I use the technique of Emrecan Çubukçu, which consists in simply making a line of pixels on the wall, with the tesselation, the window will appear on the wall.
For the main building, there was the same principle: this task was very repetitive because I placed each building, and each building was colored by hand with transform and blends, with hindsight, I probably could have done it better.
Then for the fields, I generated squares that surround the city with tile samplers, I then created an edge to detect that I use as a mask to add trees between fields to make it more convincing.
I exposed the parameters in order to be able to adjust the size of the fields etc., then I blend them with the city and here we are.
For the borders, I reuse the flood fill technique to generate a line, the color of which I can change to create the borders.
At first, I wanted to add the main city procedurally, but I soon realized it would be way too complicated, so I instead added it manually.
I decided to place it a little reluctantly with a transformed material, where I blend the height of the city with that of the map, and the same for the color, I add the mask of the water, so that the fields or the city can not appear in the water, and the trick is done!
Finally, I refused to do anything in Photoshop (even the interface), so I made the city titles and resource icons in Substance Designer
Graph of the resources:
Graph of the titles:
The Biggest Challenges
The biggest challenge of this project was to create a convincing fan art by adapting each feature into the hexagonal tiling. It complicated my task very often but also made it very interesting, just like the way the mountains are placed or how to create the fog, there are features that took me a long time to do, because it was a real headache, but it made the task exciting!
I would have liked to improve a lot of things. If I hadn't listened to my friends, I would have tried to integrate the whole game, but it was honestly impossible: for example, I added the tundra when I was already rendering in Marmoset, which wasn't very wise.
Also, I would have liked to tidy up from the beginning of the project, rename each frame, comment everything... because in this kind of project and in general, it is imperative and essential to tidy up for you and for your colleagues who can potentially retouch your files!
I learned one thing it is to set limits in projects and not to over scope, otherwise you get lost quickly in details and waste a lot of time.
Hugo Ducrocq, 3D Artist
Interview conducted by Arti Sergeev