Texture Compression Formats
Use this sheet to compare texture formats, memory costs, and common map settings. It covers BC formats for desktop and console, and ASTC for mobile. Check the target platform and inspect the compressed result before settling on a format.
The Desktop/Console Family (Bc = Block Compression, 4x4 Pixel Blocks)
| Format | aka | Bits/px | Channels | Use it for | Watch out |
|---|---|---|---|---|---|
| BC1 | DXT1 | 4 | RGB (+1-bit A) | Opaque colour, the default workhorse | Green channel slightly higher precision; blocky on smooth gradients |
| BC3 | DXT5 | 8 | RGBA | Colour with real alpha (decals, foliage cards) | Alpha is smooth but colour = BC1 quality |
| BC4 | - | 4 | Single channel | Greyscale data: height, masks, noise, roughness alone | Stores a single channel at 4 bits per pixel; compare quality with a packed alternative |
| BC5 | - | 8 | Two channels | Normal maps (X,Y; Z reconstructed in shader) | Engines set this automatically when you mark "normal map" - that's what the checkbox does |
| BC6H | - | 8 | RGB, HDR | HDRIs, skyboxes, emissive HDR | No alpha; encode times are long |
| BC7 | - | 8 | RGB(A) | Hero colour textures where BC1 artefacts show | 2x BC1's memory - spend it on faces and UI, not gravel |
Mobile: Astc
| One format, variable block size = quality dial: 4x4 (8 bpp, best) -> 6x6 (3.6, the usual default) -> 8x8 (2, distant/unimportant). |
| Rule of thumb: UI and faces 4x4/5x5 - standard materials 6x6 - lightmaps and far scenery 8x8. |
| Older Android floor: ETC2 (8 bpp RGBA). Older iOS targets may require PVRTC; check the devices you support. |
sRGB: On Or Off (The Eternal Question)
| Map | sRGB |
|---|---|
| Albedo / base colour | ON |
| Normal map | OFF |
| Roughness / metallic / AO / masks / ORM | OFF |
| Emissive colour | ON (it's colour) |
| Height / displacement / noise | OFF |
| The rule in one breath: colour = sRGB on, numbers = off. Symptoms of getting it wrong: the debugging catalogue, row one. |
The Per-Map Playbook (Desktop)
| Map | Format |
|---|---|
| Albedo (opaque) | BC1 - sRGB |
| Albedo + alpha | BC3 (or BC7 if hero) - sRGB |
| Normal | BC5 - linear |
| Packed ORM (packer) | BC1 - linear |
| Single mask/height | BC4 - linear |
| HDR sky/emissive | BC6H - linear |
| UI | BC7, or uncompressed if it must be pixel-true |
Memory Maths (Why Formats Matter)
| Uncompressed RGBA8 = 32 bits/px -> a 4K texture = 64 MB before mips (+33% with). |
| Same 4K in BC1 = 8 MB. In BC7/BC3 = 16 MB. The dropdown is an 8x memory decision. |
Quick maths: width x height x bpp / 8 x 1.33 (mips) = bytes on the GPU. |
| Mips are non-negotiable for 3D - no mips = shimmer + worse cache performance, not "sharper." |
Gotchas That Survive Every Engine Version
| Block formats need multiple-of-4 dimensions; power-of-two sizes get you that plus clean mips - our UV tool and noise tool only emit POT for this reason. |
| BC compression happens at import/cook - your source PNG/TGA stays lossless in version control; keep the source assets so compression settings can be changed later. |
| Fine text and crisp gradients are BC1's worst case - that's what BC7 (or uncompressed UI) is for. |
| Don't double-compress: JPEG source -> BC = both artefact families at once. Author in PNG/TGA/EXR. |
Deeper dives: Textures & Streaming for the engine-side budget story, and the Channel Packer to put three maps in one BC1's worth of memory right now.
