Portuguese Limestone and Azulejo Tile Textures Using Only Blender Nodes

Last week, while walking through the Alfama district and photographing crumbling building facades, I spotted a fragment of azulejo tile peeking through the moss on a limestone surface, mortar cracked around it like a bad site plan. I lowered my camera and stood there for a while. The thought followed out of habit: what node combination would I need to recreate that as a texture?

In my architectural visualisation work, I've almost never bought a paid texture pack. Not because I'm cheap — well, partly because I'm cheap — but because building nodes from scratch is the fastest way to understand the physical properties of a material. Slapping on PBR maps without understanding why limestone looks the way it does is like drawing an elevation without knowing the design intent.

In this post, I walk through my process for creating a Portuguese limestone texture and an azulejo tile texture using only Blender's built-in procedural nodes. No plugins, no external images.

Limestone: Three Layers of Noise Texture and the Role of Colour Ramp

Lioz limestone, common on Lisbon building facades, looks uniform at a glance, but up close it reveals fine fossil particles and irregular colour variations. To capture this with nodes, you need to layer three Noise Textures at different scales.

Here's the workflow.

  • One Noise Texture with Scale set to 200 or above creates the fine grain. Detail needs to be at least 8 for the fossil-like quality to come through.
  • A second Noise Texture at Scale 30–50 handles the broad colour variation across the stone surface. A Colour Ramp maps the range from cream to light grey.
  • The third, set to a very large Scale of 5–10, lays down large-scale patterns like stains and moisture marks across the entire wall.

These three layers are combined with MixRGB nodes — I mostly use Overlay mode. Multiply makes everything too dark, and Screen kills the weighty feel of limestone.

For the Bump node, connect the output of the first Noise Texture. Keep Strength between 0.15 and 0.25. Go beyond that and you end up with a lunar surface.

Blender node setup for procedural Portuguese limestone texture with layered Noise Textures

One thing that's easy to overlook is the Roughness map. Limestone isn't completely matte — when it rains, some areas become slightly glossy, and aged surfaces develop subtly different levels of sheen from wear. Feed the second Noise Texture output into a Colour Ramp and map the Roughness values to a 0.7–0.95 range. The difference is immediate.

Azulejo Tiles: Brick Texture as a Tile Grid

Azulejos are typically square tiles arranged in a grid. Blender's Brick Texture is named after bricks, but setting the Offset to 0 turns it into a square grid. This single setting is the most important part of the entire workflow.

  • Set the Brick Texture's Offset value to 0.
  • Match Brick Width and Row Height to the same value (I use 0.5).
  • Set the mortar width with Mortar Size. Real azulejo joints are quite thin — around 0.005 to 0.01.

For the patterns within each tile, combine Wave Texture and Voronoi Texture. The geometric patterns of traditional azulejos are structurally similar to wave interference patterns. Experimenting with the Bands/Rings settings on Wave Texture yields results surprisingly close to traditional motifs.

Colours are kept simple. Place the iconic azulejo blue and white at opposite ends of a Colour Ramp, driven by the Wave Texture output. The blue should be around Hex #1E4D8C, and the white should be not pure white but something like #F0EDE4 — a slightly yellowish off-white that's closer to reality. Photograph tiles that are decades old and they're almost never pure white.

Blender node setup for procedural azulejo tile texture using Brick Texture and Wave Texture nodes

To achieve the glazed look on the tile surface, lower Roughness to 0.1–0.2, but use the Brick Texture's Fac output to push Roughness above 0.8 for the mortar joints only. Glossy glazed tile faces against rough cement joints — that contrast is what makes azulejos look like azulejos.

Using Both Textures in a Single Scene

When a client commissions a renovation visualisation of Lisbon's old town, these two textures almost always appear together. Limestone on the ground-floor facade, azulejos around the entrance or in the stairwell — that kind of composition.

Handling the boundary between the two materials naturally matters. I take the Position output from the Geometry node, split it with Separate XYZ, and blend the two shaders with a Mix Shader based on the Z-axis value. Adding a bit of Noise to the boundary can even create the look of paint peeling away to reveal the limestone beneath. I keep the photos I took in Alfama open alongside for reference as I tweak the values.

The total cost of this entire workflow is zero euros. Blender is free, and my eyes and the alleys of Lisbon are my texture library. It does cost time, of course. But once you've built a proper node tree, you can tweak the parameters to produce endless variations — a fundamentally different proposition from downloading a single paid texture.

Next time I walk through Alfama, I'll stop in front of a wall again. And I'll probably be thinking about how to add a weathering effect with Musgrave Texture.

Comments