Chinese Pebble Mosaic

Material Breakdown

Julien Delannoy


Julien Delannoy

Junior Texture Artist


Hi! I’m Julien Delannoy, a Junior Texture Artist currently working at Ubisoft Bordeaux on a AAA project. I have been working in the industry for 2 years now.

I started specializing in Texturing during the last two years of my studies at PôleIIID (Roubaix, France).
I instantly fell in love with the Substance 3D Designer workflow and worked extensively to improve my skills by watching tutorials and drawing inspiration from amazing artists on Artstation.


My main inspiration came when I started discovering the work of talented Texture Artists on Artstation during my studies, simultaneously discovering the existence of this profession! I spent hours scrolling through projects and knew that this was what I wanted to do.

I was amazed by the work of artists like Jonathan Benainous, Enrico Tammekänd, Daniel Thiger, Vincent Dérozier and Pierre Fléau, to mention a few.

I enjoy the power of Substance 3D Designer and the possibility of creating incredible stylized material for almost every artistic direction possible and the more realistic ones.


For this project, I wanted to try some realistic materials and renders. I usually create more stylized materials, so the main goal was to explore new types of textures and develop my skills. When I start a new project, I always make sure it brings me something new, whether in a workflow, a style or nodes to discover, so I know on which point to focus.

For my Chinese Pebble Mosaic, I focused on the assembly of different shapes to maintain a coherent and credible aspect. I wanted to challenge myself with realistic renders and on the albedo, which could be challenging with all the different parts.


I focused my work on one main reference I found on the internet. It was exactly what I had in mind when I thought of the project at the beginning.
I generally use PureRef to gather references and make a library of my needs, but for this project, my goal was to be the closest to this one reference.


First Steps

I divided my work into 5 main parts to organize my work.

  • Hexagonal pebble
  • Square Pebble
  • Sharp rocks
  • Small Bricks
  • Border bricks I added a dirt layer and some grass between those parts to blend them better.

Main Shape

I started by making the main pattern of the texture and dividing it into masks for the different parts.

It allowed me to quickly have an overview of my material and organize myself to not be lost. I used simple shapes and transform/mirror nodes to create the main parts.


Pebble Generator

I first focused on creating a small pebble generator that I could use inside Tile Generator nodes to quickly have different types of pebbles. I needed fairly long pebbles to fit the reference, so the variations came mostly from small impacts instead of different pebble shapes. I started with a polaroid shape, with small multiply with Perlin Noise to sculpt the shape a bit. I used a Level to make the pebble pop out and added some impacts, deformation with Directional Warp.


Hexagonal Pebble

I used my pebble generator to create the hexagonal pattern in the mosaic. I basically used two different Tile Generators with just an offset to fit the reference. I slightly added some randomness with the position, rotation, and scale but not too much so it kept consistent to the eyes. I added some variations on some pebbles with beveled Perlin noise. To blend them, I used the Height Blend.


Square Pebble

For the square pebble, I chose to use a different technique to separate the two types of pebbles in the reference. This one feels more tidy, so I used the Tile Random 2; this node was perfect for the render I needed.

I used the “Slant” option and the “Corner position random” to have a smooth effect on the shapes.

This node is cool to use as shapes never overlap, and it directly gives a Flood Fill output.


I delimited the Square pebble area with a Flood Fill to Grayscale, by connecting the mask I created before into the Grayscale Input.


To create my pebbles, I simply added a Non-Uniform blur grayscale, adjusted the height with a Level. I added some details, small deformations with multiple Slope Blur and Multi Dir. Warp Grayscale connected with Clouds nodes.


Small pebbles

I added very small pebbles between those two first parts to have smaller details. For this, I created them with Polygon 2 nodes and Cell in subtract. I created a mask that I plugged into the Mask Input in the Tile Generator to have pebbles only where needed.

After this step, I started assembling the main height map of my material by using Height Blend or Blend with Max Lighten mode.


Border Stone

I created different shapes of the border rocks by creating a stroke around a previous mask with a Bevel + Edge Detect, and some shape and Transform.


Then I made the aspect of the rocks. For this, I started with a simple Bevel, and it multiplied with a custom node I created. It’s a simple one but it saved me some time as I often use this tip to add edge details.

It’s simply a Flood Fill with 4 different Flood Fill to Gradient with random seeds. I blended all of them with Min Darken.

I added a Distance node and a Level that I can play with to choose the thickness of the edge details.


After this, I added a Slope Blur with a Fractal Sum Base. I often use the Fractal Sum Base in the slope blur; it gives a lot of parameters directly in the node and allows you to have a lot of different renders.

(Play with Min Level, Max Level, and Roughness to have different results).


Then I started the details, I used a lot of Subtract to avoid a smooth appearance. At the end, I used Cells 4 in a Directional Warp with the Distance node created before.

That makes random grayscale patches following the shape. I beveled it and subtracted it with my stone to break them like in the reference.


Sharp Rocks


I used the same method as the border stone. I used the Tile Random 2 but with different parameters to have sharper shapes.
I also used my custom node FloodFill4Gradient, slope blur, etc.


To have the lines effects on my sharp rocks I used a smoother Anisotropic Noise into a Slope Blur Grayscale.
Then I added micro details as always using: Clouds, subtle spots in subtract, slope blur, etc.


I created this height map in another graph to quickly export it and duplicate it 4 times with different seeds. It allowed me to create the “diamond” effect of the main shape using Transform in 45° and Mirror.


I again used the Flood Fill to Grayscale with my main mask connected to only have the rocks where needed.


I continued the main Height Map assembly using Height Blend.



The next step was to add the dirt layer. It was mainly done using Clouds 2, Bnw Spots and Dirt nodes with sometimes some slopes.

In the end, I created a mask surrounding my height map and blended it in Add mode. It created a small bump around the shapes of my height and linked the dirt with my material very well.

Small Bricks

For the small bricks, I used a Tile Random node to have variation in the length of my bricks using random X.

I created the edge with an Edge Detect, Bevel, and added two levels of details for the edge using Slope blur with Fractal Sum Base.


To create my details I used a lot of different Flood Fill to gradient with level and put them in subtract and multiply.


I discovered a small tip to add nice details on the edge of my bricks. I created an Edge Detect with a bigger Width and then beveled it.

I blended the result in Min Darken and it created a nice second sculpt on the edge of my bricks. I connected a mask to choose on which bricks I wanted the effect.


I finished the Height by adding micro details to it, with Clouds noise, Bnw Spots connected in Multi Dir. Warp, Slope blur.



For the grass, I created my shape using a Waveform. I used a Tile Sampler with the AO as a mask to only have grass in cavities. I connected my normal in the vector node and played with the rotation input to have a nice control of the orientation of my grass. (You have to put the Vector map multiplier in Rotation to 1)

To blend my grass, I used a Non-Uniform Blur on my main height, to blur a very little bit where my grass was. Then I added a blend node in “Additive” to add the height of the grass.



For this project, I used a lot of the new “Portal” node to organize my graph and it was super-powerful to keep it clean. To start my albedo I wanted to create a “Random Grayscale” of my different parts so I could use it in directional warp, or histogram scan to add variations when needed.

In every part I’ve shown before, I created a portal node with my random grayscale. Then I blended all of them.

For the albedo, I first used a Gradient Map using my Random Grayscale and picking the gradient in my reference and repeated this in all my main parts (Square Pebble, border rocks, etc).

I sometimes added subtle details with the same gradient maps on noise.


Next, I added darker spots with HSL using the Grunge map as a mask. (I use a lot of HSL nodes to quickly add variations to my albedo). I also slightly darkened AO and used a Multi Dir. Warp so my mask isn’t too smooth.

I added small stains with warmer colors using a grunge map with a Brush Pattern and used the shape in a Tile Sampler. I started adding clearer color with a curvature mask.

I added dust by simply using the Dust node, then added some subtle spots in Overlay mode.

By connecting a grunge map and my previous Random Grayscale map in a directional warp, I could quickly add some variations in my albedo by blending it in Overlay mode.
Next, I created a second Curve Mask to add small clearer variations.


To finish my albedo and have a more realistic render, I like to blend a Curvature and Curvature Smooth in Add Sub, then convert it using Gradient Map.

I blend the result with my final Albedo in Add Sub with a small opacity, it adds a LOT of information in the final albedo! I finally added a Sharpen node to again add details.



To start my roughness I used the same method as for my Albedo. I used my main Random Grayscale created before, and added a Histogram Range for every part.

It allowed me to control my main Roughness for each part separately.


Then I started to add my details. It is important to not copy-paste the same information as in the Albedo, but try to have Roughness its specificities. I started with the Grunge Map 007 in overlay, then Added Sub with my AO.

Next, I used “Quantize grayscale” on my HeightMap to divide it into steps, and with Level I selected low value, I blended it with Sub so my material would shine a bit more in Depth. When doing Roughness Map, I like to use Add or Subtract just to give the info: Is it more or less shiny here?

It allows me to keep previous variation information in my roughness instead of applying a flat gray value. I used this method for the dust by blending my dust mask in Add.

I wanted sharp variations in my Roughness so I reused my Quantize Grayscale and blended it in Add Sub, it added a lot of details.

And then it’s finished for my graph! 😀


Marmoset To render my project I used Marmoset 3. I made different scenes to test how I could stage it to look cool.

The one I prefer is the set with the gray person and rocks in it, so I’ll focus on this one. While strolling on Artstation, I liked the render of Antoine Déjean and wanted to achieve the effect in Marmoset 3.

For the rocks, I simply found some models on Megascans that I imported into my scene.

To achieve the gray aspect of the person, I found a cool tool made by Lee Devonald here.

With this, I could render my lighting and the gray effect at the same time. I used directional lights and one with a “Gel” map to add a realistic lighting effect.



I want to thank everyone who took the time to read this article and I hope that you could pick some useful tips or learn new things.

If you want to try Designer, always go on projects that inspire you and motivate you. Even if you divagate on several at once, you’ll always take experience from each!

Substance Designer offers an infinity of possibilities and workflow, so there is no end to the discovery🙂

I also want to thank GamesArtist who allowed me to write this article and share my project!

If you want to check more of my work you can check my: