
Texture bombing starts with a slightly rude observation: a perfectly tileable texture can still look fake. Remove every border seam, repeat the material across a plaza, and the same pale stone or dark moss island returns on schedule. The texture wraps correctly. The pattern has memorized its commute.
The technique breaks that schedule in the shader. It divides texture space into cells, derives repeatable random values from each cell, then scatters shifted, rotated, scaled, or atlas-selected samples over the base material. Done well, texture bombing gives a small source set enough spatial variety for terrain, rock faces, roofs, walls, and broad architectural surfaces. Done carelessly, it replaces a visible grid with flickering confetti and a texture-sample invoice.
This guide treats texture bombing as a sampling system rather than a noise effect. Placement, PBR coherence, derivatives, blend rules, and cost all need one contract.
Texture bombing is placement, not noise
Adding low-frequency noise to base color can disguise repetition from one camera angle. It does not move the repeated crack, knot, pebble, or stain that gives the tile away. A texture bombing shader changes where recognizable motifs appear.
The classic method, documented in NVIDIA’s GPU Gems texture bombing chapter, partitions UV space into cells and places one or more images at pseudo-random offsets within them. A fragment checks the nearby cells whose stamps could overlap its position, samples each candidate, and composites the valid results.
Modern material use is broader than scattering flower sprites. A bomb can be:
- a lichen patch laid over rock;
- one complete stone variant selected from a texture array;
- a rotated copy of the same tile blended with a second copy;
- a cluster mask that chooses between complete PBR materials;
- a sparse detail such as cracks, leaves, aggregate, stains, or repair patches.
That makes randomized texture tiling different from ordinary UV distortion. Distortion bends every feature continuously. Bombing chooses discrete placements. It is also different from triplanar mapping, which solves projection across changing surface orientation. The techniques can coexist: triplanar coordinates can feed a bombing function, though the combined sample count deserves adult supervision.
Decide what may vary before writing the shader
A useful texture bombing material begins with a variation budget, not a hash function. List the visual evidence that repeats, then choose the cheapest representation that moves that evidence.
| Repeating evidence | Cheapest useful variation | Common bad fix |
|---|---|---|
| One distinct stain | Sparse masked stamps | Adding noise to the whole albedo |
| Large stone arrangement | Two or three complete tile variants | Rotating only the normal map |
| Regular color rhythm | Per-cell tint within a narrow range | Random hue across unrelated substances |
| Identical crack network | Atlas or array selection plus rotation | Stronger roughness noise |
| Terrain patches | Low-frequency material selection mask | Bombing every microdetail at full rate |
| Small aggregate | Detail-layer offsets | Paying four-neighbor samples for subpixel grains |
Keep physical scale fixed unless the source represents naturally varied objects. Scaling a brick stamp by 0.6 to 1.5 creates several brick sizes in one wall. Scaling moss clusters can look credible. Scaling brushed machining marks usually changes the manufacturing process, not merely the layout.
Rotation needs the same judgment. Pebbles tolerate arbitrary angles. Wood grain, roof tiles, flowing sediment, woven fabric, and directional scratches do not. Randomness is a tool for distributing allowed states. It is not an alibi for ignoring material structure.
Use a fixed seed per asset, chunk, or world region. Artists need repeatable screenshots, stable networked worlds, and edits that do not reshuffle the entire level because one scalar changed upstream.
The texture bombing algorithm needs neighboring cells
A minimal texture bombing algorithm follows eight steps:
- Choose coordinates and scale. Start from UV, object, or world coordinates whose units match the material.
- Split position into cell and local coordinates.
floor()identifies the integer cell;frac()gives the position inside it. - Hash the cell ID. Produce deterministic values for offset, rotation, scale, atlas index, priority, and optional tint.
- Visit candidate neighbors. Check the current cell and enough surrounding cells to catch stamps crossing boundaries.
- Transform candidate coordinates. Move into each stamp’s local frame, then apply its allowed rotation and scale.
- Sample a mask and material data. Reject pixels outside the candidate footprint; sample required PBR channels inside it.
- Resolve overlap. Use priority, height, opacity, nearest-cell distance, or a controlled blend rather than accidental draw order.
- Return a stable material. Normalize normals, preserve scalar ranges, and use explicit gradients or LOD logic where coordinate discontinuities require it.

Neighbor count follows maximum stamp radius. If a stamp can extend half a cell beyond its origin, checking only the current cell cuts it at the boundary. A 3×3 neighborhood is a common safe start in 2D, but nine candidates multiplied by several PBR samples becomes expensive quickly. Restrict size and placement so four candidates suffice when possible, or separate sparse stamps from broad tile randomization.
Keep the whole PBR set under one random transform
Stochastic texture tiling fails immediately when base color, normal, roughness, height, AO, and metalness disagree about where a patch landed. Generate one placement record, then reuse it across every channel belonging to that material event.

If a stain darkens stone, its roughness may rise or fall depending on the substance, its fine normal may soften, and its height may remain nearly unchanged. Those relationships belong in the source material. Craft or generate the complete patch as a coherent PBR set, then let the texture bombing shader position the set.
Rotated tangent-space normals need extra care. Rotating only the sample coordinates rotates the stored surface detail but leaves the decoded tangent-space vector components in the old frame. Rotate the normal’s XY components back into the destination tangent frame, preserve or reconstruct Z, and normalize. For layered normals, use a suitable method such as reoriented normal mapping rather than averaging RGB colors.
Scalar data stays linear. Roughness, height, masks, AO, and metalness should not receive sRGB conversion. Base color usually does. The sRGB versus linear textures guide covers the import boundary; bombing multiplies the cost of a wrong setting because the same error appears in every candidate sample.
For atlases, add enough padding around each variant to survive its lowest useful mip. Rotation and scale can push filtering footprints into neighboring tiles. A texture array avoids cross-tile bleed and keeps every layer at matching resolution and mip count; see the texture arrays guide.
Blend edges without breaking filtering
Hard stamp masks work for leaves, chips, decals, and objects with real silhouettes. Broad material variation usually needs a transition. A soft alpha alone can create cloudy halos, reduce normal length, and mix unrelated height states into gray paste.
Choose the blend from material logic:
- Opacity blend. Suitable for a thin deposit such as dust or lichen when the mask represents coverage.
- Height-aware blend. Useful when one substance occupies cracks or rises above another; remap heights into a comparable range first.
- Priority selection. Chooses one candidate cleanly where overlap should not create a third material.
- Distance-cell blend. Useful for complete tile variants, but cell boundaries must be hidden by enough source similarity and multi-sample filtering.
- Macro mask. Controls where bombing is allowed, so moss does not appear under overhang rules it cannot satisfy.
Coordinate discontinuities are the quiet failure mode. Implicit texture derivatives estimate how UV changes across neighboring pixels. Hash-driven offsets, rotations, and cell jumps can make those derivatives invalid, producing wrong mip choices, seams, and shimmer.
Compute the base coordinate gradients before the discontinuous cell logic. Transform those gradients with each candidate’s rotation and scale, then use derivative-aware sampling such as SampleGrad or the engine equivalent. Explicit LOD can be acceptable in controlled cases, but one fixed LOD does not replace anisotropic filtering across perspective. The texture filtering guide explains why distant grazing surfaces are the rude test.
Texture bombing in Unity, Unreal Engine, and Blender
For texture bombing Unity projects, put cell hashing, neighbor evaluation, coordinate transforms, and gradient-aware sampling inside a Shader Graph Custom Function, then wrap it in a Sub Graph with material-facing inputs. Unity documents both string and include-file modes in its Custom Function Node reference. Keep a cheaper Sub Graph variant for low tiers, and expose seed, world scale, rotation limits, sample count, and blend width rather than the hash’s internal constants.
For texture bombing Unreal Engine, build a Material Function that accepts Texture Objects plus coordinates and outputs the channels your material actually needs. Epic’s Material Functions documentation describes reusable graph packaging and shared updates. Engine-content helper functions vary by version and project; inspect their graph and sample count before adopting them. A named function is not a performance waiver.
For texture bombing Blender materials, Voronoi cells can provide stable regions and feature positions while White Noise or hash-style node groups derive random transforms. Blender’s Voronoi Texture manual documents cell distance, color, and position outputs. Cycles can afford richer node graphs for final renders; for a real-time export, bake chosen variation into textures or reproduce the same algorithm in the destination shader.
Across all three, keep coordinate scale in world units when multiple meshes must share one continuous distribution. Use UV space when placement must follow an unwrap or deforming asset. World-space bombing across independently moving objects can make the surface appear to swim through its geometry.
Texture bombing performance is mostly sample arithmetic
The first texture bombing performance estimate can happen on paper. Multiply candidate count by sampled channels. Four candidates times base color, normal, and one packed ORM texture means twelve texture samples before macro masks, source layers, or shadows. Nine candidates turn the same material into twenty-seven samples. The profiler will not accept “but the moss feels spontaneous” as a counter.
Reduce cost in this order:
- Bomb only the layer with recognizable landmarks.
- Pack compatible scalar channels, with documented color space and mip behavior.
- Cap overlap so fewer neighbor cells can contribute.
- Use atlas or array variants instead of separate texture bindings where appropriate.
- Move macro selection to vertex, terrain, or low-frequency masks when per-pixel precision is unnecessary.
- Add static quality variants so unused branches compile out.
- Fade to a cheaper far-distance method before samples become subpixel.
Do not optimize by letting PBR channels use different random seeds. That saves no sampling and spends material credibility. If roughness detail is too expensive, drop or simplify that layer deliberately instead of sampling the wrong region.
Measure GPU time and texture bandwidth on target hardware. The texture compression guide helps choose packed formats, but compression cannot remove sample instructions.
Validate texture repetition removal in motion

Build one test strip with flat ground, a steep slope, a curved wall, a hard UV seam, mirrored geometry, and several object origins. View it from overhead, grazing, and gameplay cameras. Then move. Many texture repetition removal tricks pass a still frame and dissolve into swimming cells once the camera moves.
Run five captures:
- source texture tiled normally;
- color-only bombing;
- complete PBR bombing;
- lowest shipped quality tier;
- forced mip and anisotropy ranges.
Look for repeated clusters, cell boundaries, chopped stamps, normal rotation errors, height halos, atlas bleed, LOD popping, and temporal shimmer. Test a flat gray lighting environment as well as final art lighting. Dramatic fog is excellent at approving materials it cannot see.
The best texture bombing workflow 2026 records source scale, coordinate space, seed scope, candidate radius, neighbor count, transform limits, blend rule, normal handling, derivative path, sample count, quality tiers, and fallback. If an artist cannot predict which control changes distribution and which changes material response, the graph still needs a public interface.
FAQ
What is texture bombing?
Texture bombing is a procedural shader technique that places texture samples at deterministic random offsets, rotations, scales, or variant indices. It reduces obvious repetition across large surfaces without requiring one enormous unique texture.
How does texture bombing work?
The shader divides coordinates into cells, hashes each cell to produce placement values, checks nearby cells, transforms sample coordinates, and composites valid stamps. A production version applies the same placement to every related PBR channel and preserves texture gradients for correct mip filtering.
What is stochastic texture tiling?
Stochastic texture tiling is a family of methods that randomize how repeated texture data is sampled or combined. Texture bombing is one approach; other methods blend transformed tiles, use cellular regions, or choose variants from arrays.
How do you implement texture bombing in Unity?
Use a Shader Graph Custom Function or hand-written shader to hash cells, evaluate neighbors, transform UVs, and sample with correct gradients. Wrap the function in a reusable Sub Graph and expose scale, seed, transform limits, sample count, and quality options.
Does Unreal Engine have texture bombing?
Unreal materials can implement it in a reusable Material Function using texture objects, coordinate expressions, hashes, and blends. Engine-content helpers may vary by version, so inspect the actual function graph and profile its samples instead of assuming a fixed built-in contract.
Can texture bombing work in Blender?
Yes. Voronoi and random-value node groups can drive per-cell offsets, rotations, scales, and variant choices in Blender materials. Bake the result or reproduce the logic in the target engine when the asset must ship in real time.
Is texture bombing expensive?
It can be. Cost grows roughly with candidate count times the number of texture channels sampled, plus blend and hash math. Restrict overlap, bomb only recognizable layers, pack compatible data, add quality tiers, and measure on target hardware.
Try CraftPBR
Texture bombing distributes material variation. CraftPBR builds the coherent source material it needs:
- Text-to-PBR creates aligned base color, normal, roughness, height, AO, and metalness from a material description.
- Photo-to-PBR converts a controlled surface reference into a coordinated PBR set instead of a lit color snapshot.
- Node workspace keeps tiling, levels, roughness, height, masks, and variant preparation editable.
- Engine export prepares normal orientation, scalar color space, channel packing, filenames, and target conventions.
- Free tier lets you generate and validate a complete source material before building the distribution shader.
- CC0 output lets you modify, combine, bake, render, and ship generated textures without attribution.
Build the material before scattering it
Generate one coherent PBR set, prepare controlled variants, then let the shader distribute them without breaking map alignment.
Build a material in CraftPBRMake the tile honest first. Then make its return time unpredictable.