What textures actually cost

Texture memory budget

Optimisation is the last step of the texturing pipeline and the one that decides whether any of the rest ships. Three levers matter: resolution, compression and mipmaps. Two of them save memory; the third spends a little to save a great deal of bandwidth. Move them and watch the budget.

Controls one material's worth
2048
4
24
2 GB

A map stack is albedo, normal, height, occlusion, detail and so on — every one of them is a full texture, which is why a single "material" is rarely one image.

The mipmap chain, to scale

One texture, level 0
With the whole mip chain
Mipmap overhead
Whole scene
Against the budget

Every lever, priced whole scene, with mipmaps
FormatBits/texelPer textureWhole scene

Block compression is decoded in the texture unit, so a compressed texture is not merely smaller in memory — it moves a quarter as many bytes across the bus on every fetch. That bandwidth saving is usually worth more than the memory saving.

Halving the resolution the cheapest lever there is
ResolutionPer textureWhole scenevs. now

Texture cost is quadratic in resolution. Dropping 2048² to 1024² does not save half — it saves three quarters, and on anything the camera never gets close to, nobody can tell.

Where the one-third comes from. Each mip level has a quarter the texels of the one above it, so the chain costs 1 + 1/4 + 1/16 + 1/64 + … times the base texture. That series converges to 4/3 — about 33% more, no matter how large the texture is or how many levels it ends up with. It is a fixed, predictable surcharge, and in exchange you get filtering that neither shimmers nor reads hundreds of texels per pixel. This is as close to a free lunch as real-time graphics offers, which is why mipmaps are effectively mandatory on anything that is ever seen at a distance.