Azulejos Tiles

Material Breakdown

Robin Rebiere


Robin Rebiere

Material Artist


Hello! My name is Robin Rebiere, I am a French Material Artist living in Barcelona. I previously worked for two years on the InstaMAT material library.
It's a pleasure to share my knowledge about this software and material creation.


These past two years, tile materials were my favorite to make. I wanted to showcase what I learned and create intricate patterns. In my daily life in Barcelona, I see various decorative tiles almost every day, and it’s pretty inspiring.

I used InstaMAT for the material creation and Unreal Engine 5 for the rendering.


I have separated my references into two parts, one for the pattern inspiration and the other for more precise details about tiles, like surface wear, cracks, and slope.

I particularly liked the glaze cracks and tried to emphasize them a bit. When working on Manmade material, I like to watch videos of people creating it in real life.

It’s a great way to catch details you could miss and know more about the history and culture of the subject. On a side note, I wanted to share with you a website I particularly like when it comes to tiles references:


Material Breakdown Layers

Before spawning the first node, it’s crucial to break down the material from a big problem into smaller issues.

How to create the patterns, the glaze cracks, the damaged parts, and everything I wanted to include in my final material.


It’s important to gather several references for each element; it helps understand how the surface reacts, and picking elements on different refs allows creating something unique.


I began the material by creating the first pattern. I usually start with the base height, but I wanted to articulate this material around the patterns so it was easier to get one before starting anything else.

To do so, I used multiple Bezier Curve nodes.


I decomposed the reference into three layers: light blue as the top layer, blue as the middle layer, and deep blue as the bottom layer. I imported the reference as a background and created each layer using curves.

I used the black line as a guide to visualize where the pattern stops and used symmetry to save some time.

I didn’t create the pattern in another software to avoid any export-import and streamline the process to enable quick iterations.


I used a Guided Scatter as a base because it includes a Flood Fill output for a cheap execution time.

I smoothed the tiles a bit and used a slope blur to break the very straight edge; it won’t be noticeable because the grout will cover it, but the slopes I’m using afterward will benefit from it to create more random edge damage.

With the levels node, I clamped the height range from [0;1] to [0;0.8] to get the [0.8;1] range free to add surface details and slope variation.

It’s important to have an idea of the height map manipulations that will be needed to not end up adjusting it later and possibly breaking stuff.


I added some macro surface details to give each tile a different look.

Main Color

I won’t break down every single step as it would be too long, but the main goal is to make each tile unique with various brushing layers and vary the size of the details such as spots, color bleeding, or crazing.


For the brushing, I simply mapped an Anisotropic noise on the tiles with a Flood Fill Mapper node. For the pattern color, I played a lot with transparency.


I kept the background color (gray comment) fairly simple in detail as the patterns already have a lot of information. I used a tiny bit of brick and pattern color to recall the main color.


I liked the glaze cracks I saw in many references, so I tried to mimic it by creating an nPass graph that I explain just below. I then scattered these cracks, applied them to the tile color, and played with big, medium, and small sizes.

Glaze Cracks – nPass

For the crazing, I found some kind of hierarchical relation, with big cracks appearing, then smaller and smaller.
It’s a repetitive process, perfect to leverage the nPass graph strength.


A nPass graph repeats the same operation and uses the result of the previous iteration as input.

The goal of this graph is to select a certain number of cells, add a cut into them, and repeat the process as many times as needed, so ultimately the cells become smaller and smaller while they still are built around the first crack’s input.


This is the beginning of the graph; I’m multiplying the input with the “Buffer” which is the output from the previous iteration.

So the node is building up the effect iterations after iterations.


Here with the Pass Index as seed, I’m bringing variation to each iteration; otherwise, they’ll all be identical. With the Mod Uint, I’m rotating the gradient by 90 degrees on each odd pass.

The Perlin Noise helps to break the linearity of the gradient. I’m using a Quantize node to cut in half the gradients and then add them to the main crack pattern.

The density parameter helps bring more variance. Adding all these variations allows to avoid any grid effect and make the pattern more organic.


Lastly, with a Flood Fill to BBox, I’m removing the smallest parts to avoid any tiny noisy cracks and I’m closing the gaps with a Distance node.

The final image goes on the Output but also in the “Buffer”, so the next iteration will know where to start.


This part will be about edge damage, cracks, and the color applied to these elements.


Nothing too fancy here, mainly slope blur nodes. I like to add a Quantize node with a low count to replicate shards and step in the damage.

Another workflow I like, it’s to add Directional nodes with a low strength and direction amount set to 4, it helps break the characteristic look slope blur nodes can have.


I didn’t plan to add cracks at first, but in the end, the material was a bit too clean to my taste.

I used the Glaze Cracks I did and in a similar way to the edge damage, I wore the pattern a bit. I then added sloppiness to tile chunks to make the tile catch light more interestingly.

For the color, I used a slope blur as a mask with low samples to create blades and a fading from white to brick color.
Doing so creates a remnant of white color layer on the highest area.

Same for the cracks, the brick color is mostly where the cracks are the strongest. I highlighted the cracked part by adding a subtle black glow around them, it gives the material a more fragile look as it suggests that it was simply crazing before breaking for good.


One of the smallest parts, I mostly built it by stacking layers of noises and used a Mask Blur node at the end to smooth a bit some area and make the result less uniformly noisy by reducing the high-frequency amount.


One technique I like to implement is to subtract and add the same noise to the main height and invert the mask of one of the blends (the blends with float parameters connected to them).

As a result, the average height value is the same but I’m still creating depth.


I employed the same details from color and height into the roughness but kept them low and added details on top of that.


I wanted this map to bring new details to the material and not a copy-paste from the color or height to give its unique details.

I always create an “ElementImageGray” parameter for each element (tile, pattern, grout) to get better control over their roughness and then add/subtract details from it, similar to what I did with the grout.

Tips and Tricks

A few things I’d like to share: using many heavy grunges and noises in your graph can slow it down, and reusing them as much as possible can greatly reduce the whole material execution time.


There is also a node that can quickly help iterate on colors which is named “Palette”; it’s not part of the node library but it’s made inside a material from the library so it’s accessible for anyone.

You can find it by adding “Ceramic Tiles Green” to your graph, double-clicking on it to open it, then opening the template and you’ll be in the master material. Press Ctrl+F and look for “Palette”.

You can copy and paste it into your current graph. Exposing key parameters as soon as possible to ensure the global look remains identical even when adjusting parameters such as Tile Count or Edge Damages for example.

It can avoid bad surprises and save up time. Another tip: it can be helpful to work on different tasks and regularly switch between them to avoid ending in a “tunnel vision” and missing details.

On this project, I regularly switched from working on the main material to doing patterns for a couple of hours, it helped to “reset”.


I utilized Unreal Engine 5 for my renders with a previously built scene I’m using for material rendering. I recommend having such a setup to save time and be able to see the material in the Engine at each creation step.


I started by exporting the material using the UE template from InstaMAT. For the best look, I recommend adjusting some compression settings inside Unreal Engine, “Masks (no sRGb)” for the AORM map and “BC7” for the height map.


I made a master material with simple features such as UV tiling, offset, and displacement strength. To do so I cranked up the default displacement to a high number (20) and then with a “Displacement Strength” parameter I can adjust the height map, 0 it’s a middle gray, and 1 it’s the height map.


To speed up the render process, I set up a batch render scene. With several mini-scenes on the same map.

Then I created a level sequence and added each of the cameras to it.

To render the final images, I used the Unreal plugin “Movie Render Queue” and I rendered it frame by frame as if it were a video. By doing this I can render all my scenes in a couple of seconds with lit and detailed lighting images for each of them.


I mostly did this part on InstaMAT as it’s non-destructive and I could still adjust depth of field, sharpness, or vignette effect after the renders were made.


On top is the quick setup I made for Artstation renders, simple but handy for adjusting values. While writing this article, I realized that using depth render as a mask could be better, so I gave it a shot and it worked nicely (bottom part).

In my opinion, it’s worth the extra time to make the thumbnail as good as possible, to maximize your chance of your work being seen.


I’m very pleased to have had the opportunity to share my work process and this material. I kept information light into technical explanations to make the article easy to read.

If you have any critiques, questions, or interrogation, feel free to reach me on my social platforms. I wish you a great and creative journey!