Painted Ceramic Tiles

Material Breakdown

Ludovic Petiot


Ludovic Petiot

Texture Artist


Hello, I’m Ludovic Petiot, a Texture/Technical Artist at Adobe.
About a year ago, I joined the team to work on the Substance 3D Assets library and undertook various tasks involving communication assets and software content, such as the latest Substance Painter materials.


Before joining Adobe, I spent a few months working on Assassin’s Creed: Mirage, an experience that greatly inspired me to create these Ceramic Tiles.

I crafted these tiles using Substance Designer, incorporating patterns as I wanted to explore and experiment with the new splines tool. All the renders were produced using Blender.

References & Inspiration

As mentioned earlier, my work on Assassin’s Creed: Mirage fueled my passion for Ceramic Tiles and intricate floral patterns. I discovered a reference that perfectly fit my vision and began building upon it.

Additionally, I aimed to include damaged tiles to achieve organic and realistic degradation throughout the material.

Evolution along the project

As the project unfolded, the notion of creating more than just a single material emerged. I aspired to develop something more intricate and practical for production.

This led to the creation of what we term “Filters” here at Adobe, providing extensive customization options and the ability to generate an infinite variety of materials. For clarity, here are the filters I implemented:

  • Tiles Creation: To generate tiles, remove them, or break them using a single grayscale pattern input. This allows me to easily create new patterns for diverse materials.
  • Patterns: Enabling the insertion of a base color, combined with the previous filter, facilitates the creation of various color variations.
  • Concrete Intersection: Though more of a material than a filter, it operates similarly. I aimed to have various parameters for adjusting it as needed, including patterns and intersection thickness. With these ideas, I embarked on creating the final version of what you’ve witnessed.

Material Creation

I won’t delve into specific nodes for each effect, but I’ll provide an overview of how I approached the creation, combining elements to bring the material to life.

Initially, I aimed for a filter that could effectively work with a single input. Grayscale Variation proved ideal, ensuring consistent values regardless of the pattern used.

This provided the essential elements for creating the height: a mask (derived from the grayscale variation using Edge Detect) and the grayscale variation.

A Flood Fill node was then used to generate nodes like Flood Fill to Gradient and Flood Fill to Color. These nodes aided in establishing the height, the tilt of the tiles, and breaking the tiles at different levels of detail.


A trick employed here involves combining different gradient variations to create random-shaped edges on select tiles. This allowed for breaking the tiles in half by grabbing the edges.


Subsequently, the process was repeated for multiple tiles to create progressively thinner damages, with control over the amount of damage using a mask from the flood fill.


At this stage, almost everything was completed, and a final Flood Fill was used to generate the necessary outputs for the tiles.


A final tip employed was to auto-level everything before plugging the height as the output. This ensured the full range was utilized. Adjustments were made to the higher and lower values, providing flexibility to add or remove surface details during material creation.


Pattern 1 Creation

Following the tile creation, I delved into crafting the main pattern. One of my prerequisites for pattern creation was using Spline, driven by a desire to explore this new tool.

The entire pattern was crafted using a few key tools: “Spline (Poly Quadratic),” “Spline Append” for merging, “Spline Fill” for closing shapes, and “Spline Render” for the final pattern version. These were combined into grayscale values, facilitating easy mask creation using the “Color to Mask” node.

To create a directional brush effect following the pattern, I sought to avoid recreating the entire pattern. A combination of “Mask to Paths” -> “Paths to Spline” -> “Spline Render” / “Scatter on Spline” was employed.

This allowed the extraction of edges from the black and white input to create a mask for the edges or scatter another input on them.

The final outputs for the pattern were complemented by variations of paint brush effects and a Paint Accumulation output.


Concrete Material

The approach here was straightforward, commencing with the height and building everything from there. An innovative aspect was using the Random Grayscale Variation output of the tiles to introduce variation in the concrete, such as varying height and rotating leaks.

The granularity of this material was achieved through Voronoi Fractal, in conjunction with leaks and other variations.


Pebbles and Damage

Pebbles were created after the primary elements, were adjusted to the tiles’ height using a Shape Splatter. This node not only conformed the pebbles but also generated an output akin to a Flood Fill.

This output served for creating masks and introducing color variation in the later stages of the graph. The pebbles themselves were kept less detailed, considering their small size in the final textures.

Blend everything

With all the components prepared, the next step was blending everything into a single graph. The Height Blend was instrumental in blending the concrete and tiles, offering flexibility in adjustments.

Most operations involved Add or Subtract, ensuring the addition or removal of details. The objective was to avoid other blending modes that might result in issues when merging elements.

This stage also involved adding details uniformly across the textures, such as damages occurring on both tiles and concrete to maintain a logical approach mirroring real-life scenarios.


While it may seem like a shortcut, the Dust node in Designer proved effective for creating dirt/dust effects. Leveraging Ambient Occlusion and/or Normal, combined with custom noise, yielded impressive results.

For this project, multiple Dust nodes were created to introduce different layers and weathering effects.

Additionally, an edge dirt layer was added, enhancing focus on the tiles and the pattern within.

The material creation was now complete.

Examples of the final textures, showcasing the material’s versatility, are presented below. The subsequent steps involve creating renders, but before that, textures need to be exported, and parameters exposed for generating an infinite array of variations.

Tips & Tricks

Moving Tiles

The Moving Tiles node, designed by Nicolas Wirrman, Principal Product Manager at Adobe, was introduced to break continuity between tiles. Unlike conventional methods, this tool manipulates UVs by moving and rotating them.

This ensures logical placement of the pattern on broken tiles, maintaining a consistent look.


Exposing Parameters

As demonstrated in the video, exposing parameters facilitates easy control over the material. This approach eliminates the need to navigate deep into the graph to manage individual nodes.


Importantly, it allows for the reuse of the material outside Substance Designer, for instance, in Substance Painter, by importing the material as a .sbsar file for further adjustments.

A brief explanation outlines the process and rationale:

  • Histogram Scan: Exposing the position parameter provides control over the shape’s hardness. This creates a slider ranging from 0 to 1, offering visibility control from a non-visible shape to a full white circle. A Linear Interpolation node adjusts the Histogram Scan range, constraining it between 0.5 to 1 for enhanced control.
  • Tile Generator: Rather than directly exposing the Integer for Tile Amount X and Y, a single parameter (float) controlling both is created. This simplifies the presentation, especially when dealing with high tile numbers. An Empty Function and Linear Interpolation are utilized to translate float to integer values, ensuring a slider controls the tile count effectively.

On the tile materials, having multiple parameters significantly aids in creating variations. Examples of the same material using different parameters are showcased below.

For the creation of animated parameters, the $time input, combined with multiplication by a float, allows adjustment of timings, enabling control over animation speed.



To effectively demonstrate exposed parameters, animated renders were created using the .sbsar format, which embeds exposed parameters and utilizes the $time value for animation.


For animation creation, Substance Player is crucial. It allows for parameter manipulation in .sbsar files and exportation of textures with animated content.

If $time values are present in exposed parameters, the timeline in Substance Player aids in visualizing material evolution over time.

Exporting the sequence is straightforward, requiring the use of the “Export as Bitmap” button in Substance Player.


Ensure accurate entry of frame rate, frame count, and export location in the subsequent window.


Lighting & Rendering

The scene’s simplicity allowed focused attention on the material itself. A single plane and shadow blockers were used to create contrast, emphasizing specific areas of the plane.


The material was kept basic, with minimal adjustments for Size and Rotation to extract optimal results.


For animated renders, a simple switch from “Single Image” to “Image Sequence” facilitated the rendering of animated content.


In terms of lighting and rendering, the process remained straightforward.

Various renders were produced, showcasing different perspectives.

The same scene was replicated with a different camera viewpoint.

Post Process

Every project concludes with a post-process pass, a critical step for enhancing the image.

The post-process involved standard adjustments such as overall white and black adjustments, contrast addition, a subtle color tint, and vignetting for focal point emphasis.

A touch of noise/grain and sharpening were applied to eliminate any residual blurry effects in the final renders.


Having a clearer initial vision would have saved time, but the evolution from a single material to an exposed one with various parameters, patterns, and tiles proved beneficial.

The graph was reordered to create a more logical structure, enhancing the material’s effectiveness. While the shift did not result in significant time loss, the decision to move from a single material idea to the current version proved ultimately satisfying.

Thanks for reading this breakdown; I hope it proves helpful to some of you! Special thanks to GameArtists for suggesting this breakdown!