Bit depth and banding
How many steps a texture channel can store (8, 16 or 32 bits), why smooth normal and height maps band at 8 bits, how dithering hides it, which file formats keep the precision, and why a terrain heightmap must be 16-bit.
Bit depth is how many bits a texture uses to store each channel of each pixel. More bits mean more possible values: 8 bits give 256 steps, 16 bits give 65,536, and 32-bit float can store values far above 1. Banding is what you see when a smooth gradient has too few steps: visible stripes, rings or terraces instead of a soft transition.
Adobe's export documentation sums up the problem: "Exporting 8bit textures can lead to banding in gradients", and "This is especially noticeable with Normal and Height maps" (Substance 3D Painter documentation: Export settings).
#When 8 bits is enough
For a base colour, 256 steps per channel are plenty. Painted colour has noise and detail that hide the steps, and engines compress the texture anyway (see texture formats, compression and mipmaps).
Data maps are different. A normal map stores a direction in each channel, mapping −1 to 1 onto 0 to 255, so each step is 2/255, about 0.008. On a large, gently curved surface the baked normals change very slowly across many pixels. At 8 bits the change happens in visible jumps. Glossy reflections make them obvious, because, as Bend Studio's Stefan Groenewoud puts it, "a tight specular lobe amplifies every small normal deviation" (ArtStation blog: Day 24 - Quick - Specular Aliasing). The jumps show up as rings in highlights. A height and displacement maps has the same problem in a different form: a slow slope becomes a staircase.
#Worked example: a terrain heightmap
Unreal stores landscape heights "with 16-bit precision", and at the default Z scale of 100 your heights "will be between 256 m and -256 m" (Unreal Engine documentation: Landscape Technical Guide). That is a 512 m range.
- 16 bits: 512 m ÷ 65,536 steps = 7.8 mm per step. Smooth enough for anything a player will walk on.
- 8 bits: 512 m ÷ 256 steps = 2 m per step. Every gentle hill becomes a flight of two-metre terraces.
This is why terrain tools export 16-bit heightmaps, and why Unreal's importer lists "16-bit grayscale PNG" and "16-bit grayscale r16" among its formats (Unreal Engine documentation: Landscape Technical Guide). If you must work with an 8-bit source, shrink the height range instead: an 8-bit map over a 10 m range still gives about 4 cm steps.
#Dithering
When the output must be 8-bit, dithering adds a little noise before rounding, so neighbouring pixels round up and down in a mixed pattern instead of in solid bands. Adobe: "Dithering introduces noise which helps to mitigate banding issues while still using 8 bits of information" (Substance 3D Painter documentation: Export settings). Substance Designer applies it automatically when a baker output is saved to an 8-bit file, "to avoid banding in 8bit normal maps", and Substance Painter offers it as an export option for the normal, displacement and height channels (Substance 3D bakers documentation: Is dithering applied to baked textures?).
#File formats and bit depth
Not every format can hold more than 8 bits. Adobe's export table lists TGA, JPEG, BMP and WebP as 8-bit only; PNG and PSD as 8 or 16-bit; TIFF as 8, 16 or 32-bit float; and OpenEXR as 16 or 32-bit float (Substance 3D Painter documentation: Export settings). In engines:
- Unreal Engine: the Displacement Map setting is listed as "8/16bit" and HDR textures use a float format with no sRGB (Unreal Engine documentation: Texture Compression Settings).
- Godot: EXR and HDR files support HDR and are "highly recommended for panorama skies"; PNG and WebP are limited to 8 bits per channel (Godot documentation: Importing images). Heightmaps are always sampled with linear filtering, and Godot notes that most heightmaps contain mainly low-frequency data, so a lower resolution is often enough (Godot Engine: BaseMaterial3D class reference).
- HDR images (skies, light probes) need 16 or 32-bit float, because they store light far brighter than 1.0. See emissive materials and tonemapping.
#Further reading and watching
Related: colour space: sRGB and linear, baking, texture file formats, terrain and landscapes.
References
- · Export settings · Substance 3D Painter documentation · docs · accessed 2026-10-21
- · Day 24 - Quick - Specular Aliasing · ArtStation blog, 2026 · article · accessed 2026-10-21
- · Landscape Technical Guide · Unreal Engine documentation · docs · accessed 2026-10-21
- · Is dithering applied to baked textures? · Substance 3D bakers documentation · docs · accessed 2026-10-21
- · Importing images (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
- · Texture Compression Settings (Unreal Engine 4.27) · Unreal Engine documentation, 2021 · docs · accessed 2026-10-21
- · BaseMaterial3D class reference (source) · Godot Engine (GitHub) · docs · accessed 2026-10-21
Pages that link here
- Texture file formats Reference
- Modeling rocks, trees and terrain pieces Topic
- Baking Topic
- Fixing baking artefacts Guide
- Colour space: sRGB and linear Key term
- Normal map Key term
- Height and displacement maps Key term
- Photo-sourced and scanned materials Topic
- Tonemapping Key term
- Colour grading and LUTs Key term
- Fog and atmosphere Topic
- Terrain and landscapes Topic
- Heightfield erosion Key term
- Texture memory (VRAM) Key term
Last updated 2026-10-22