Derelict Hallway Walls

I utilise Vertex Painting in order to break up the repetition of the Materials by creating a four layer shader. Each Layer is masked by one of the RG or B Channels of the Vert Colour.

I utilise Vertex Painting in order to break up the repetition of the Materials by creating a four layer shader. Each Layer is masked by one of the RG or B Channels of the Vert Colour.

Derelict Hallway Walls

I finally got around to playing through The Last of Us games, and while doing so, I found myself deeply inspired by the visual techniques used throughout. That inspiration led me to recreate one of the surfacing methods I saw, which is also common in many modern AAA titles.

For this scene, I created the wall materials and used Megascans assets to help fill out the shot for presentation purposes. The primary goal was to showcase a set of tiling wall textures using a shader technique that leverages multiple surface textures and vertex color masking to break up repetition and add detail.

This method uses smaller, tileable textures and blends them using vertex color channels to create variation across large surfaces. The benefit is a potential 16x memory saving, since you're reusing small textures instead of relying on a few massive ones—though this comes with a slight cost of more draw calls.

=============================
Vertex Masking and Shader Details
=============================
In this scene, I used vertex painting to break up tiling patterns. Each vertex color channel (RGB) acts as a layer mask:

R channel replaces the base layer with a variation (scratches, discoloration, etc.). In Blender, I blend between texture sets using the Blend node; in Unreal or Unity, this is done with a Lerp node and the alpha/factor input.

G and B channels are reserved for overlays, G = Mould and B = Dirt

These overlays use additional alpha masks, allowing me to paint Mould, Dirt, or both on top of either the Base or Variation layers.

This gives me 8 possible combinations from a single material setup:
- Base
- Variation
- Base + Mould
- Variation + Mould
- Base + Dirt
- Variation + Dirt
- Base + Mould + Dirt
- Variation + Mould + Dirt

The meshes here are low-poly (as they're just walls), so to avoid the visible smooth gradient blending from sparse vertex data, I used a Perlin noise texture on top of the vertex mask with an overlay blend to retain the masks high and low values. This breaks up the smooth gradient and adds more believable variation. I then remapped the gradient to tighten the transition using a Remap node. This could also be done with a Contrast node or by multiplying and clamping the mask values.

If I revisit this in future, I’d like to replace the Perlin with hand-painted masks for more artistic control over how those blends break up.