Texture arrays
A stack of same-size, same-format textures that a shader picks from by index; how arrays differ from atlases and 3D textures, why terrain and layered materials use them, the rules and limits (custom shaders, streaming), and how to make one in Unreal, Unity and Godot.
A texture array is a stack of 2D textures that share one size and format, stored as a single texture object. The shader chooses a layer, or slice, by number. Unity defines it as "a collection of 2D textures with the same size, format, and flags", where "you can use an index to sample each slice" (Unity Manual: Introduction to texture arrays).
For artists, arrays matter in two places: terrain and other layered materials that need many surface types in one shader, and any custom shader that picks a texture per object or per pixel. You will rarely make one by hand, but you will often author the textures that go into one, and the rules are strict.
#Why use one
- Many surfaces, one material. Unity calls arrays "an efficient way to access many textures of the same size and format" and singles out "custom terrain rendering systems" as a typical use (Unity Manual: Introduction to texture arrays). A terrain shader that blends grass, rock, mud and snow can read all four from one array, choosing slices from a splat map or index map (see terrain layers and splat maps).
- Clean tiling. Each slice is a complete texture with its own 0–1 UV space, so it can repeat like any tileable material. A region of an atlas cannot, because normal wrapping repeats the whole atlas.
- No bleeding between layers. Godot notes that an array is like a 3D texture "but without interpolation between layers" (Godot documentation: Importing images), so filtering and mips never mix the rock slice into the grass slice.
#Format rules
Every slice must match. Unity requires "the same size, format and flags" (Unity Manual: 2D texture arrays), so:
- All slices share one resolution. A 4K cliff and a 1K pebble texture cannot share an array; scale them to one size first.
- All slices share one compression format and colour space. Keep base colours (sRGB) and normal maps (linear, BC5) in separate arrays (see colour space: sRGB and linear).
- Slices are chosen by number, so keep a written order (slice 0 grass, slice 1 rock…) that the material and the artists agree on.
#Costs and limits
- Platform support. Unity lists DirectX 11 and 12, Metal, OpenGL Core, OpenGL ES 3.0 and Vulkan, and offers
SystemInfo.supports2DArrayTexturesto check at runtime (Unity Manual: Introduction to texture arrays). - Streaming. As above, Unity does not stream arrays (Unity Manual: Introduction to mipmap streaming). Unreal's
UTexture2DArrayhas stream-in and stream-out functions, "Only usable if the asset is streamable" (Unreal Engine documentation: UTexture2DArray). See texture streaming. - Memory per slice. An array of eight 2K BC7 slices uses eight times the memory of one slice, so budget it as eight textures.
#In different tools
- Unreal Engine: a Texture2DArray asset holds a list of source textures (shown as Add Textures), and can also come from a multi-slice DDS file (Unreal Engine documentation: UTexture2DArray). It has separate address modes for the X, Y and Z axes (Unreal Engine documentation: UTexture2DArray).
- Unity: import a source image divided into cells as a 2D Array, build one from script with the
Texture2DArrayAPI, or render into one (Unity Manual: 2D texture arrays). Sample it in a custom shader (Unity Manual: 2D texture arrays). - Godot: set the import type to Texture2DArray, then sample it in a custom spatial shader (Godot documentation: Importing images). Godot's importer has a Normal Map (RG Channels) option available only for layered textures such as arrays (Godot documentation: Importing images).
#Further reading and watching
Related: shaders for artists, master materials and instances, terrain and landscapes, vertex painting and blending, texture atlases.
References
- · Introduction to texture arrays · Unity Manual (6000.2) · docs · accessed 2026-10-21
- · Importing images (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
- · Large Scale Terrain Rendering in Call of Duty (Advances in Real-Time Rendering 2023) · SIGGRAPH 2023 Advances in Real-Time Rendering in Games, 2023 · talk · accessed 2026-10-21
- · 2D texture arrays · Unity Manual (6000.2) · docs · accessed 2026-10-21
- · Introduction to mipmap streaming · Unity Manual (6000.2) · docs · accessed 2026-10-21
- · UTexture2DArray (API reference) · Unreal Engine documentation · docs · accessed 2026-10-21
Pages that link here
- Texture streaming Key term
- Texture atlases Topic
- Terrain and landscapes Topic
- Terrain layers and splat maps Key term
Last updated 2026-10-22