Congratulations Lukas:) Amazing piece of 3D parametric shader:) thank You for sharing Your knowledge:)
Great studio. Great game will be.
Maybe ... but dont try to touch it xD
Tom Jacobs did a detailed breakdown of his complex 3d environment material, which combines pebbles, water and a ton of little details.
Hi there! My name is Tom Jacobs and I am living in the Netherlands. I am currently self-employed operating under the name Millionviews.com and have worked on various projects for broadcast, film, interactive media and games. I did a multimedia design study at the GLR in Rotterdam and afterward an animation study at the HKU Hilversum. I was hooked to 3d since we got to work with 3dsmax 2.5. So, since then, 3d is my core technique to produce and animated projects. I have worked at a big VR studio in Amsterdam on various VR projects, on game projects and interactive media and animations for studios and clients in the Netherlands. Later this year, I will join a great studio to continue my 3d skillset as a technical texture/shader artist. Software-wise, I mainly use Maya, the Adobe suite, Fusion, Substance Designer, Unreal Engine, World Machine, and Unity. This would be my second interview about creating textures in Substance Designer and will cover fundamentals about how to create the Biotope material.
Mars in UE4 with SD textures, an early version was released at the Space Expo in the Netherlands. Visitors can walk on Mars, which is assembled with real satellite data.
The Biotope Material
Initially, I planned to recreate a beach gravel based from a 3d scan in Substance Designer, I was experimenting with my self-made custom nodes and tried the stones made less super sharp and more realistic. This quickly results in these typical round pebbles found on the beach and near rivers. And I kept searching for the reference. A reference such as 3d scanned work or just simply searching for river pebbles, fishes underwater, underwater shots and so on. The water was just a try out at first but exploded quick. This would be my third attempt to do water in Substance Designer. The first one was mud which was very plain. The second one was another mud example like this image.
Image 2: Second WIP mud example. The water looks very muddy and washed out as in real life. Stones look a bit too gelly currently.
So, I started to think about what happens to a place with almost nonmoving water and searched for that kind of references too.
Instead of creating a beach gravel scenery, this texture became one big piece of nature where water was involved and I always wanted to try out some tricks with water. Then the next key thing is to get all elements play well together. The water with the stones, so make the stones wet and dry on top. Put some fishes in the water to make it alive. Add fallen flower petals, twigs and other natural elements to improve the feel of having a snapshot from a wet gravel piece of nature. The sand was a bonus and here I wanted to see if I can let the sand play together with the water, meaning, let the sand flow towards the water and let it spread out and make it muddy in certain areas. Here I used my flow node to create some flows that wrap around stones. These elements are hardly visible within the final render, but I consider these typical elements you’ll miss if they are not there. My background is about animation, and animation is a lot about tricking one’s mind, so I believe the same is true for textures or even everything about digital creation.
Breakdown: 1. AO, 2, dry ground, 3 + water, 4 + twigs + finetuning.
The Gravel Part
The gravel is made using my custom instanced nodes, it generates cells of different sizes and then used my ‘stone block’ node to generate stones out of it. The base graph doesn’t have any layering at all but here I spent some time to make them round and add some variation to it. The roundness is done with the mosaic node. It takes a slightly blurred version as an intensity map.
Image 3: My rock graphs mostly start with this setup. The cell field custom node basically generates cells based upon input and then I use the flood fill tools to create stones. The stones are ‘just’ random blended flood fill gradients, blended with each other.
Image 4: Steps to generate stones with a lot of variation.
Until now, I haven’t done any coloring yet.
All the time I also keep track of a random mask to use it later for generating different colors. This is the hardest part because it makes the graph very complex very fast. For every warp, I also must set up second or more warps just to match the random mask with the height mask as seen in this quick example.
There are properly more efficient ways of doing this, but this ensures me that I have a very valid correct mask that matches the heightfield exactly and I can color individual stones.
Image 5: Example of synch masks.
Variation of Stones
The different stones al comes from the ‘stoneblocks’ node in conjunction with the cell generator node as seen in the previous image. I also developed a few nodes to enlarge resulting stones and let them shrink or raise. (see image 4) Creating a more natural layering effect. The second pass is where it really becomes the dense looking gravel field. Here I used a combination of splatter node with the previously generated base and merge them with the smaller ones. There are roughly 3 or 4 different sizes of stones. I think what also works very well is to let big gravel bury beneath tiny gravel and secondly have a noisy map and just simply add the gravel on top of the noisy map. The sharp stone is tilesampler scatters and subtracted from the input map for the cell grid. The magic however mostly comes from the custom cellfield node, because it takes an input and creates different sizes of cells. Black generates small cells, white large. This can be seen in image 3. This really helps to create clusters of stones.
Creating the cracks on the white stones
The cracks on the very white stones have been generated using my flow node. It creates some cool vein like flows based upon a heightmap and when pushing the iteration/particle numbers it starts to branch very nicely. There are several ideas on how to create cracks. Slopeblurring any lines with noise already generate some interesting cracks, but in this case, I wanted to see if my flownode can tackle some organic look already. The difficulty is to properly guide the flownode because it depends on slope values. Very round shapes will generate very smooth flows. All custom nodes are available within the graph.
Image 6: Small example of flownode. One result is much smoother because of the in-between blur node while the other shows a lot of noisy frequency.
Image 7: Actual use of Flownode inside the graph. The cracks are guided by cell 1 node and then I used a few noisy nodes to distort it a bit.
The flow node itself is an FX map, it generates random patterns and then starts moving downwards every iteration based upon any slope. Here I sample the normal map on each move and calculate a new direction of it. Thus, generates flows that match the shape.
The water is still very fake and I used a combination of tricks to make it believable:
1. There are fishes, this creates a connection of water immediately in our minds.
2. Make the underwater area dark, mossy, add caustics.
3. Skip the rendering of the normals of everything that is beneath the water. (!)
4. Add correct roughness for the water and the wetness.
5. Add tiny raising around the edges of the stones. Water has a certain amount of resistance.
6. Add subtle ripple effect.
7. I added fake shadow to the stones in the water and the fishes.
8. The diffuse map can be altered is such a way that the deepest areas of the water become fuzzier and less visible. This is also a creative way of constructing muddy water. In image 2 about the mud, you can see a tiny bit of transparency close to the edge of the water stones and becomes much more diffuse the further away we get from the edges.
Image 8: Breakdown of main steps of the base color map.
Creating the refraction/transparency part
Image 9: Example of basic water setup, the special node ‘Simple output’ are just instances that bundles most common outputs.
To create water, the very beginning is to add a uniform color node, adjust its color and then use max blending with the ground.
The max blending mode just really cut out everything beneath a certain threshold. So, this looks almost instantly like water. Adding the points from the list above does help make it more realistic. The refraction is simple: a warp or direction warp on all water area will create some fake refraction.
The Integration of Different Elements
For the integration of all elements, the key thing here is to think about small little stories…a chain of cause-effect. What happens to an area when there is water for several months/weeks? How does it have an impact on its surrounds? How does gravity work in these areas? What does wind do? I always like to think about the bigger picture and then create the texture accordingly to it.
This can make the task overwhelming, however.
Technically, the whole graph is split up into different passes (subgraphs). The pass where the colors are introduced is the biggest one. Because here the key elements have played together. I am still thinking of ways to split this up because I like the graphs to be more tight and clean and it becomes much easier to focus and even debug graphs.
Combining elements that should interact with each other are the most difficult graphs to combine for me because you almost have to map entire graphs in your mind and don’t forget about all the different layers and masks. I am also very much aware of the 0 – 1 color range and the math it can involve. I think this can help in constructing a graph a lot. In Substance Designer, tech meets art is very much true.
Adding Sand and Making It Wet
The sand is a combination of different Spot noises, but the key to getting some feel of sand is to add some tiny larger gravel to it. For very tiny sand, a pixel noise can do a lot of too. Then I used a non-uniform blur to let it smear out into the water. Sand is still very difficult. The tiny granulates are mostly semitransparent and it because of this tininess they don’t really settle, but instead clump together on a macro level. Color, shading, and variation of the sand must play together very well. I did not found the magic key here and still experimenting with some ideas.
Rendering the Texture and Material in Marmoset Toolbag
Marmoset Toolbag is fundamental of the realism of this texture in terms of light and crispiness. I hit basically every single feature in Toolbag such as reflections, AO, GI, HighDPI, hires shadows and so. Obviously, the performance is going way down. In my case on my hardware, it really takes a bit of time to push out a render. Although still way faster than an offline render.
The HighDPI is one of the key features that enable a very sharp render. It means that the render is twice as big then the viewport but then scaled to the viewport size. UE4 has a similar feature when taking screenshots.
For the light, I really love the low sunsets, they create long shadows and therefor unhide a lot of details and overall shape of the texture. The water has a Fuzz mask applied so at lower angles a Fresnel type of effect kicks in. This effect can also be used for sand and desert although it quickly looks ghostlier then real dust. That is because it doesn’t get blocked by the shadow while it would look more realistic if it would
In terms of steps, in my case, I am applying all the textures, adding the sky and light first and next play around with the light angles and intensity. Next, I pick a cool camera shot that highlights the most interesting features. Then I start enabling all the beautiful features and check how it looks in high quality. GI-Tessellation must also be enabled for GI to work correctly. Also, the overall color tends to change a bit. On top of that, GI reacts with its surroundings, so anything you add to the scene will have an impact on colors.
Image 10: Marmoset Toolbag left part all features enabled, right part non. Lowsunset on a desert skybox with a blueish sky and low sun.
Love to end this interview by giving some links to my work to check out some examples:
It was an honor to have this interview and it was my pleasure to talk and share about some in-depth information on this Substance Graph! Hopefully, it will inspire others and improve or build on top of these ideas.