Developing Tiling Environment Textures for Games
Environment is 80% of what a player sees. Walls, floors, ceilings, ground — thousands of square meters of surfaces that must look convincing. Covering them with unique textures is impossible: VRAM is not infinite, and an artist team is not rubber. The solution is tileable textures, but made correctly.
"Correctly" here doesn't mean "seamless." Seamlessness is a minimum requirement. A correct tiling environment texture is: physically accurate by PBR values, with no visible repetition pattern at any screen resolution or camera distance, with a complete set of maps for the rendering pipeline.
Where Repetition Pattern Comes From and How to Remove It
A 2048x2048 tileable texture at real-world scale of 2×2 meters in a 100×100 meter game level tiles 50×50 times. When viewed from height or diagonally, the repeating element — a crack, spot, characteristic stone — becomes visible immediately.
There are three working approaches for production:
Scatter + Splatter overlay. On top of the tileable base, add a second layer with large scale (x0.1–0.3 from the base UV) and low opacity. The second layer is the same or similar texture, but at a different scale. Mathematically this destroys the pattern: the eye can't find a repetition point when two tileable patterns with different frequencies overlay.
Stochastic sampling in the shader. In Unreal Engine 5 this is the MF_StochasticSampling function, available natively. In Unity — custom HLSL in ShaderGraph: take three samples with different hashed UV coordinates and blend by weights. Overhead is minimal (3–5% GPU time on fragment shader), result is complete pattern elimination.
Vertex Painting with multiple tileable layers. For Landscape in Unreal and terrain in Unity, this is the standard approach: four to eight tileable materials blend via vertex paint with masks. Each material is independent, one pattern doesn't coincide with another.
The third approach requires the most resources, but gives maximum control over material distribution on the level.
What Goes into a Complete Map Set for Environment Texture
For deferred rendering (Unreal Engine 5, Unity HDRP), a tileable environment texture is a set:
- Albedo (Base Color) — without lighting, without shadows, without AO. Only diffuse color of the surface
- Normal Map — in DirectX space for Unreal, OpenGL for Unity (different Y axes are a constant source of errors when transferring textures between engines)
- Roughness — the most critical map for "feel" of the material
- Metallic — for environment almost always 0 everywhere, metallic zones are masked
- Ambient Occlusion — baked from high-poly or procedural, adds dark zones in crevices independent of dynamic lighting
- Height Map — for Parallax Occlusion Mapping on large surfaces where depth illusion is needed (stone masonry, tiling, brick)
- Displacement — for Tessellation in Unreal, giving real geometric deformation
For mobile platforms the set is reduced: Normal + packed (Roughness R, Metallic G, AO B). Height and Displacement are completely removed (tessellation on mobile is unacceptable for performance).
Physically Correct Values for Typical Environment Materials
This is not abstract theory. Incorrect roughness and albedo values are the most common reason why a level looks "flat" or "plastic," even with good lighting.
Working ranges for typical surfaces:
| Material | Albedo (sRGB) | Roughness | Metallic |
|---|---|---|---|
| Old asphalt | 50–80 | 0.90–0.95 | 0 |
| Polished concrete | 100–130 | 0.70–0.80 | 0 |
| Rough stone | 80–120 | 0.88–0.95 | 0 |
| Dry soil | 100–140 | 0.92–0.98 | 0 |
| Wooden boards (old) | 90–130 | 0.82–0.90 | 0 |
| Metal plate | 160–200 | 0.25–0.45 | 0.92–0.98 |
Albedo below 30 (pure black) and above 240 (pure white) in PBR pipeline is physically incorrect: such materials don't exist in nature.
Creating Tileable Textures in Substance Designer
The graph for an environment material in Substance Designer is built around several principles:
Multi-level noise. Macro noise (large tonal and color variations) + Micro noise (fine surface texture, pores, grain). Without micro noise the surface looks plastic at close range. Without macro noise — flat at a great distance.
Procedural weathering. Dirt, moss, cracks — all through masks based on Position (vertical dirt accumulation at the bottom), Curvature (wear on edges), AO (accumulation in crevices). This makes the material convincing without manual painting.
Grayscale-first approach. First build a complete Height/Luminance graph, then add color via Color Mask. This allows correcting material form without affecting color and vice versa.
| Task Scale | Estimated Timeline |
|---|---|
| One environment material (complete map set) | 2–4 days |
| Set for one biome (5–8 materials) | 2–3 weeks |
| Complete library for a level (15+ materials) | 4–8 weeks |
| Revision and re-assembly of existing materials | by agreement |
Cost is calculated after analyzing the specification: number of materials, target engine, platform and parameterization requirements.





