Removing Texture Repetition! Cell Bombing in Unreal Engine

Removing texture repetition is a common issue when working with tiling textures in Unreal Engine. If you’ve ever noticed the same pattern appearing over and over, making your surfaces look unrealistic, you’re not alone! Thankfully, there’s a technique called cell bombing that helps break up the repetition and add more variety to your materials.

In this guide, we’ll walk through removing texture repetition using the cell bombing technique, explaining how it works, and providing you with complete control over random scale, offset, and rotation. By the end of this tutorial, you’ll have a deep understanding of how to create more dynamic materials and improve the realism of your Unreal Engine projects.

If you prefer watching instead of reading, check out the full video.
Want to support our work and get access to exclusive perks? Join us on Patreon!
You can also download free Unreal Engine assets on our website.


Understanding Texture Repetition in Unreal Engine

Before we dive into cell bombing, let’s first understand why texture repetition occurs and why it’s such a big issue in game development.

Why Does Texture Repetition Happen?

  1. Tiling Textures – Most materials rely on tiling textures to cover large surfaces without using massive texture maps. However, tiling often leads to obvious patterns.
  2. Uniform UV Mapping – If the UV coordinates are evenly spaced across a surface, identical portions of the texture appear at regular intervals.
  3. Lack of Variation – When a texture is simply repeated without any transformations, it becomes easily recognizable, breaking immersion.

To solve this, we introduce cell bombing, a procedural technique that adds randomness to the way textures are sampled.


Setting Up the Base Material

Let’s set up a simple material so we can compare the difference.

1️⃣ Create a new material in the Content Browser. Name it something like M_Default and open it.
2️⃣ Drag in a texture—I’ll use a forest ground texture for this example. 🌲
3️⃣ Add my UV manipulation function (or use a Texture Coordinate node if you prefer).
4️⃣ Promote the size input to a parameter and name it Size – Main Texture. Set it to 1.
5️⃣ Connect the texture to the Base Color, save the material, and create a material instance.
6️⃣ Assign the instance to a plane and set the size to 0.1 so we can clearly see the repetition.

At this point, you’ll notice the texture repeats in a predictable way. Not ideal, right? Well, that’s where cell bombing comes in!

A tiling texture showing clear repetition issues in Unreal Engine

What Is Texture Cell Bombing?

Cell bombing is a smart technique that uses a Voronoi texture to introduce randomized UV offsets to our main texture. Instead of a repetitive pattern, you get unique variations across the surface.

Each cell in the Voronoi texture has a different value, which offsets the UV coordinates of the main texture. This randomization makes the texture look more natural while maintaining performance.

You can get the Voronoi texture from here.

Applying Texture Cell Bombing to Remove Texture Repetition

Now that you know what cell bombing does, let’s implement it:

1️⃣ Duplicate the plane and material, renaming this version to Cell Bombing.
2️⃣ Create a new material instance from the cell bombing material and assign it to the plane.
3️⃣ Set the size to 0.1, just like before.
4️⃣ Open the Cell Bombing material and drag in a Voronoi texture.
5️⃣ Duplicate the UV function and size parameter, renaming it to Cell Texture Size.
6️⃣ Connect the Cell Texture parameter to the UVs input of the Voronoi texture.
7️⃣ Pick one of the Voronoi channels (G works well) and add it to the UVs of the texture to offset the main texture’s UVs.

Unreal Engine material setup using Voronoi texture for UV offsetting
cell bombing has removed the texture repetition

Fixing Cell Bombing Artifacts

At this stage, you’ll notice a big improvement—the texture repetition is gone! But if you zoom in, you might see sharp borders between cells. That’s because the Voronoi texture itself has hard edges.

We can fix that by blending between two texture versions using the alpha channel of the Voronoi texture.

1️⃣ Add a Lerp (Linear Interpolation) node to blend between normal and offset textures.
2️⃣ Use the Voronoi alpha channel, pass it through a Saturate node, and connect it to the Alpha input of the Lerp.
3️⃣ Duplicate the main texture, connect it to the A input of the Lerp, and use the UV function for its UVs.
4️⃣ Connect the cell-bombed texture to the B input of the Lerp.

material setup of removing the hard edges in a cell bombing material

With this setup, areas where the alpha is black will use the normal texture, while areas where it’s white will use the cell-bombed texture. This smooths out the cell transitions and removes the unwanted hard edges.

before using Lerp blending to smooth Voronoi cell borders
after using Lerp blending to smooth Voronoi cell borders

📌Before and after using Lerp to blend texture cells


Random Scale: Breaking Up Uniformity to Remove Texture Repetition

1️⃣ Add a Lerp Node – Hold L and click to create a Lerp node.

2️⃣ Use the Cell Texture’s Red Channel – Drag the Red channel from your cell texture and connect it to the Lerp node.

3️⃣ Create Scale Parameters – Hold S and click to add two parameters. Name them Min Scale and Max Scale.

4️⃣ Set Scale Values – A good range is 0.9 to 1.1, but you can tweak it as needed.

5️⃣ Divide UVs by Scale – Hold D and click to add a Divide node. Connect your UVs (Texture Coordinate node or World Position node) to A, and the Lerp node to B.

6️⃣ Link to the Texture UVs – Connect the Divide node to the Add node handling the UVs.

Unreal Engine material setup showing random scale applied to a texture

Random Offset: Shifting Textures to Reduce Texture Repetition

Scaling helps, but adding a parameter to control the random offset makes it even better. Here’s how to do it:

1️⃣ Insert a Multiply Node – Hold M and click to add a Multiply node before the Add node.

2️⃣ Create an Offset Parameter – Hold S and click to add a parameter called Random Offset Strength (Default: 1).

3️⃣ Connect Nodes – Attach the Multiply node to the Add node.

4️⃣ Test in the Level – Open the material instance and tweak the offset value.

If you set Random Offset Strength to 0, the effect disappears, and texture repetition becomes visible. As you increase the value, the textures shift randomly, breaking up uniformity.

Material graph showing random offset applied to textures

Random Offset Direction: Ensuring True Randomness to Remove Texture Repetition

Right now, all cells move in the same direction. To achieve random movement in all directions, follow these steps:

1️⃣ Use an Append Vector Node – Add an Append Vector node.

2️⃣ Assign Channels – Connect the Red channel to U and the Green channel to V.

3️⃣ Expand Value Range – Multiply by 2 and subtract 1 to shift values into the -1 to 1 range.

Material graph demonstrating true random texture movement

Random Rotation: Enhancing Natural Variation to Remove Texture Repetition

For the final touch, let’s add random rotation to further disguise repetition:

1️⃣ Add a Rotate About World Axis Node – This node allows rotation around a defined pivot point.

2️⃣ Set Pivot to World Center – Hold 3 and click to add a Constant 3 Vector (0,0,0).

3️⃣ Convert UVs to a 3-Vector – Add an Append Vector node, linking the existing UVs with a constant.

4️⃣ Create a Rotation Parameter – Hold S, add a scalar parameter called Rotation, and set the default to 0.

5️⃣ Multiply with a Cell Texture Channel – Multiply the rotation parameter by a Blue channel from the cell texture.

6️⃣ Adjust to Degree Scale – Divide by 360 to match rotation degrees.

Material graph showing Rotate About World Axis node in use

Fixing Rotation UV Issues

If setting Rotation Randomness to 0 makes the UVs disappear, that’s because the output is 0. To fix this:

1️⃣ Add an Add Node – Place an Add node between the masked R and G channels and the UVs.

2️⃣ Ensure UVs Are Non-Zero – This ensures a valid UV input at all times.

3️⃣ Save and Test – Adjust the Rotation Randomness Amount parameter and check the results.

Material graph showing how to fix UV issues with rotation randomness

A More Natural Texture Distribution

By combining random scale, offset, and rotation, you can drastically remove texture repetition and create realistic, organic-looking surfaces. This method is especially useful for large terrains, walls, and any textured surfaces where tiling patterns break immersion.

Want to access the project file of this tutorial? Join us on Patreon!


Fixing the Normal Rotation

When working with materials in Unreal Engine, especially complex transformations like cell bombing, you might notice that normal textures don’t always behave as expected. They can become misaligned or even flipped, which can ruin the shading and lighting of your surface. To keep things looking natural and ensure removing texture repetition works effectively, you need to adjust the normal rotation properly.

Why Normal Rotation Needs Fixing

Normal maps are essential for adding fine details to a material without increasing the polygon count. However, when you rotate textures to break repetition, the normal map must rotate correctly too. If not adjusted, the lighting and shading will look incorrect, making the surface appear unrealistic. Let’s go step by step to fix this issue properly.

Adjusting the Normal Map Rotation

To make sure your normal textures follow the same transformations as the rest of the material, you need to apply a Rotate About World Axis function. This function ensures that the normals rotate correctly and maintain accurate shading.

1. Adding the Rotation Function

First, find some space between the texture and the Lerp node in your material setup. Then:

  • Add a Rotate About World Axis node.
  • For the pivot point, hold 3 and click to add a Constant 3 Vector.
  • Connect the vector to the pivot input.

2. Correcting the Rotation Amount

Now, to ensure the normal texture follows the right rotation:

  • Take the Rotation Amount value you already set in your material.
  • Multiply it by -1 to invert the rotation.
  • Hold M and click to add a Multiply node.
  • Set the A value to -1 and connect the B value to the Divide node.
  • Connect this Multiply node to the Rotation Amount input of Rotate About World Axis.

3. Adjusting the World Position and Texture Z-Axis

  • For the World Position input, use the texture’s position.
  • Add the Z-axis output to the texture.
  • This ensures that the normal map follows the correct world coordinates.
unreal engine material graph showing how to fix the normal rotation issue

4. Controlling Normal Texture Behavior with a Switch

To keep this effect optional and apply it only when needed:

  • Add a Static Switch node.
  • Create a Static Bool Parameter, name it Is Normal Texture.
  • Connect the Add node to the True input.
  • Connect the texture directly to the False input.
  • Finally, connect the Switch to the B input of the Lerp node.
Unreal Engine material setup using a Static Switch for normal texture handling

Final Testing and Adjustments

After saving the material, check the results in your level. If everything is set up correctly, the normal maps should now rotate properly, ensuring that removing texture repetition works without affecting the lighting and shading. If the normals still look incorrect, double-check the Multiply and Switch connections.

By adding these small adjustments, you can maintain proper shading across your materials, making your environment look more realistic and avoiding the common issues that arise when rotating textures.

Now, your textures can be randomized without breaking the surface details, giving your scenes a more natural and immersive look!


Considerations

In a previous tutorial, we explored how to use the Texture Bombing function. However, Cell Bombing is a more performance-friendly alternative that can still significantly improve visual quality.

Balancing Quality and Performance

To understand the performance impact, click on Lit, navigate to Optimization View Modes, and set it to Shader Complexity. This visualization highlights shader intensity, helping you evaluate performance costs. Texture Bombing with POM (Parallax Occlusion Mapping) is the most complex, while Cell Bombing is slightly more demanding than a regular texture but much more optimized than the traditional Texture Bombing method.

For interactive environments like games and simulations, finding the right balance between quality and performance is crucial. Cell Bombing provides a middle ground, maintaining high visual fidelity while ensuring your project runs smoothly.

Shader complexity comparison between Texture Bombing, Cell Bombing, and standard texture mapping in Unreal Engine

Handling Stretching and Sampling Issues

While Cell Bombing does a great job at reducing visible repetition, it may introduce minor texture stretching in some areas. Fortunately, this is only noticeable when zooming in extremely close. If you’re using this method in landscape materials, it’s best to adjust the Sampler Source of your texture samples to Shared: Wrap for all textures.

If you skip this step, Unreal Engine might fail to compile the material without showing an error message. This small tweak ensures stable performance and seamless blending across large surfaces.

Unreal Engine material settings showing Shared: Wrap option for texture samples

Fixing Unwanted Artifacts and Choosing the Right Textures

If you notice unusual artifacts when using Cell Bombing, double-check that both your Texture Size and Cell Texture Size are set correctly. A good rule of thumb is to set the Cell Size to at least 10 times bigger than the original texture. However, the exact ratio may vary depending on the texture and scene.

This technique works exceptionally well with organic textures like dirt, grass, and moss, but it may not be ideal for structured patterns like brick walls or tiled wood floors. The randomness introduced by Cell Bombing can disrupt uniform patterns, making them appear unnatural.

On the other hand, this method is compatible with displacement and tessellation, meaning you can still achieve depth and parallax effects without compromising the material’s integrity.


Final Thoughts: Achieve Seamless, Non-Repetitive Textures

By using cell bombing, random scaling, offsetting, and rotation, you can effectively remove texture repetition in Unreal Engine. This technique is great for landscapes, walls, floors, and organic surfaces, ensuring a much more realistic look.

If you want to experiment further, download the project file of this tutorial from our Patreon!
And watch the video for more details, considerations, and examples.

If you enjoyed this tutorial, here’s how you can stay connected:

Get instant updates on our Telegram channel.
Engage with fellow creators & showcase your work in our Discord server.
Join our Facebook group.
Unlock exclusive perks and support us on Patreon.

Happy creating!