If you've ever tiled a stone texture across a large wall prop and watched the repeat pattern become glaringly obvious at 10 meters, you've hit one of the most common material problems in game development. The fix is not a bigger texture — it's smarter UV coordinate control inside the Material Editor.
This post covers every major texture coordinate technique in Unreal Engine 5: precise UV tiling with the TexCoord node, animated scrolling with Panner, seam-free triplanar projection with WorldAlignedTexture, and combining multiple UV channels in a single material. Each technique builds on the last, and by the end you'll have a reusable modular wall material that holds up at any viewing distance.
The Problem with Default UV Coordinates on Large Assets
When you import a mesh into UE5 and apply a material, UE5 maps the texture using UV Channel 0 — the coordinates baked into the mesh at export time. That works well for hero assets with custom UV layouts, but it breaks down quickly in two scenarios:
Large tileable surfaces. A 4×4 meter floor plane with a 1:1 UV layout means the texture stretches across the whole surface. Tile it too aggressively and you see repetition; leave it at 1× and the texels are enormous.
Merged or procedurally placed meshes. Rocks, terrain sections, or modular walls assembled at runtime often have UV layouts that were designed for isolated use. Combine three wall pieces and you get three independent UV islands that tile at different apparent scales.
The solution is to drive UV coordinates inside the material itself, not rely on what came out of Blender or Maya.
TexCoord and Constant Bias Scale: Tiling Control in the Material Editor
The `TexCoord` node (shortcut: `U` in the Material Editor) outputs the raw UV coordinates of the mesh. On its own it reads exactly like the imported UVs. The power comes from multiplying those coordinates before they reach a `Texture Sample`.
```
TexCoord[0] → Multiply(4.0) → Texture Sample (Base Color)
```
Multiplying by 4.0 tiles the texture four times across the surface, which keeps texel density consistent regardless of the mesh's world scale. You can expose this multiplier as a scalar parameter (`S` to create a `ScalarParameter`) so you can tune it per material instance without recompiling:
```
TexCoord[0] → Multiply(TilingScalar) → Texture Sample
```
For non-uniform tiling (different scale in U vs V), use an `AppendVector` to build a 2D multiplier:
```
AppendVector(TilingU, TilingV) → Multiply → TexCoord[0] → Texture Sample
```
This is essential for trim sheets, where U tiles along the length of a surface and V maps discrete trim sections without repeating.
![]()
The `Constant Bias Scale` node is a one-node shortcut for the `(x + bias) × scale` operation. For UV work you usually bypass it in favor of explicit Multiply/Add nodes, but it's useful when you need to remap a 0–1 range to –0.5–0.5 for a centered pan offset.
| Node | What it does | Common use |
|------|-------------|------------|
| TexCoord | Outputs mesh UV coordinates | Base for all UV ops |
| Multiply | Scales UV for tiling | Tile control |
| Add | Offsets UV position | Pan offset, seam hiding |
| AppendVector | Builds 2D UV scale | Non-uniform tiling |
| Panner | Time-animated UV scroll | Water, lava, conveyors |
| WorldAlignedTexture | Projects in world space | Terrain, rocks, props |
Panning and Scrolling: Animated UVs with the Panner Node
The `Panner` node takes a UV input and a `Time` input and scrolls the coordinates at a constant velocity. This is the backbone of every animated surface material: ocean water, lava flows, conveyor belts, emissive neon text, and scrolling scanlines.
```
TexCoord[0] → Panner(SpeedX=0.02, SpeedY=0.0) → Texture Sample (Normal)
TexCoord[0] → Panner(SpeedX=-0.01, SpeedY=0.015) → Texture Sample (Normal)
```
Layer two Panner outputs and add the normals using `BlendAngleCorrectedNormals` to get non-repeating normal detail — the two patterns scroll at different speeds and directions, so the eye never locks onto the repeat cycle.
For water you typically use three layers:
1. Large low-frequency Panner — gentle large-scale surface movement
2. Small high-frequency Panner — close-up ripple detail
3. Radial distortion driven by a sine curve for wave crests
A common performance mistake is using high-resolution textures with Panner when a 512×512 tileable normal map with aggressive tiling is far cheaper and looks identical at game distances. Always set your Panner textures to `Sampler Type: Normal` and `Mip Gen Settings: From Texture Group` to let the streaming system handle resolution.
Triplanar Mapping with WorldAlignedTexture: No UV Seams on Any Surface
Triplanar mapping projects a texture from three world-space axes (X, Y, Z) and blends the results based on the surface normal. It requires zero UV coordinates on the mesh — UE5's `WorldAlignedTexture` function node handles everything internally.
```
WorldAlignedTexture
├── TextureObject: T_Rock_D
├── TextureSize: 512
└── WorldScale: 200
→ Base Color
```
`WorldScale` controls how large the texture appears in world units. A value of 100 means the texture tiles every 100 cm. This is the single parameter you tune to match texel density across differently scaled meshes.
The blend between the three projection axes uses the absolute value of the world normal, which means any surface angled between axes gets a smooth weighted blend. Top-facing polygons get the XY projection, side-facing polygons get XZ or YZ. The transition is seamless.
When to use triplanar:
- Landscape material layers where UV seams are impossible to hide
- Rock and boulder clusters assembled from scattered instances
- Procedurally placed modular walls where UV continuity between pieces would require custom UV work per layout
- Any asset purchased from the BitSoul marketplace where you need texture continuity across different mesh orientations
When to avoid it: Close-up hero assets where you want precise texture placement control, and any asset with unique features (decals, logos, damage) that require UV-mapped positioning.
![]()
Combining Multiple UV Channels in One Material
Meshes can carry multiple UV sets. Blender exports them as UV0, UV1, UV2; UE5 reads them as `TexCoord[0]`, `TexCoord[1]`, `TexCoord[2]`. A common pattern is:
- UV0 — tiling detail texture coordinates (no unique mapping needed, just scale control)
- UV1 — lightmap UV (unique, non-overlapping, used by Lumen and baked lighting)
- UV2 — second tileable layer at a different scale for macro detail blending
A macro/micro detail blend using two UV channels:
```python
# Blender — two separate UV maps baked into the mesh
uv_detail = mesh.uv_layers.new(name="UVDetail") # UV0
uv_macro = mesh.uv_layers.new(name="UVMacro") # UV1
```
```
# UE5 Material Graph
TexCoord[0] × 8.0 → T_Stone_D (micro detail)
TexCoord[1] × 1.0 → T_Stone_Macro_D (large colour variation)
Lerp(Macro, Micro, Macro.R) → Base Color
```
The macro layer carries slow-varying colour variation — darker patches, moss, mineral streaking — while the micro layer provides fine texel detail. Blending them prevents both the blur of pure macro and the tiling repetition of pure micro.
Putting It All Together: A Practical Modular Wall Material
Here is a production-ready material setup for a modular stone wall kit. The material works on any piece in the kit without per-mesh UV adjustment, and the key parameters are exposed for Material Instance overrides:
Parameters exposed:
- `TilingScale` (scalar, default 4.0) — master tile multiplier
- `MacroBlend` (scalar, default 0.4) — macro detail influence
- `UseTriplanar` (static bool) — switch between UV and world-space projection
- `NormalStrength` (scalar, default 1.0) — bumpiness control
Graph summary:
```
[Branch: UseTriplanar]
├── True → WorldAlignedTexture(T_Stone, 512, TilingScale×50)
└── False → TexCoord[0] × TilingScale → T_Stone
→ Lerp with macro layer → Base Color
TexCoord[0] × TilingScale × 2.0 → Normal Map → FlattenNormal(NormalStrength)
```
The triplanar branch handles corner pieces and rotated walls. The UV branch handles flat panels where you've taken the time to lay out a clean UV. Material Instances switch between them with a static bool — no shader permutation cost at runtime.
All stone, concrete, and brick tileable textures for this kind of setup are available on the BitSoul marketplace, pre-packed with Base Color, Normal, ORM (Occlusion/Roughness/Metallic), and matching macro variation maps.
Start Building Smarter Materials Today
The TexCoord node, Panner, and WorldAlignedTexture cover 90% of real-world texture coordinate problems in UE5. Master these three and you can adapt any imported asset — from your own meshes to assets sourced from BitSoul's marketplace — to tile cleanly, animate smoothly, and hold up at any camera distance without artist intervention per mesh.
Start with a single modular wall material, expose TilingScale as a parameter, and apply it as a Material Instance across your entire kit. That one change eliminates per-piece material assignments and makes texel density consistency a one-slider problem.