Real-time PBR dies in memory bandwidth before it dies in shader math. Uncompressed 2K RGBA is 16 MB per map. Four maps and you have spent a hero-character budget on one tile. Compression is mandatory. The mistake is using the same block format on albedo, roughness, and normals. Each map fails in a different way.

Choose resolution before you choose a codec

Compression cannot rescue an oversized set. Follow the PBR texture resolution guide: 1K for small or distant props, 2K as the real-time default, 4K for hero close-ups only. Download what you need from the Locker3d catalog, then compress in the engine. Keeping an 8K source in the library is fine; shipping it is not.

Locker3d textures are free CC0, so you can resize and recompress for a game build without a license issue. See CC0 rules.

Formats that work on desktop and console

  • BC7: Best general color and quality for albedo. Higher cost than BC1, far fewer blocks and color shifts. Prefer BC7 for hero wood and painted surfaces.
  • BC1 (DXT1): Acceptable for low-contrast albedo or packed masks if you must save memory. Bad for saturated logos and thin dark lines.
  • BC5: Two-channel, the usual choice for tangent normals (RG, reconstruct Z). Do not use BC1 on normals.
  • BC4: Single channel for roughness or metalness if you do not pack them.

Unreal and Unity expose these as default or platform settings. Do not leave “source default” on a PNG that the editor then treats as uncompressed in editor and randomly compressed in a packaged build.

Mobile: ASTC is not one quality

ASTC lets you pick block size. 4×4 is near-lossless and heavy. 6×6 is a solid albedo default. 8×8 is for distant or low-frequency maps. Roughness packed in a channel can tolerate 8×8 better than a normal. Test a brushed metal highlight: block artifacts show up as crawling sparkle when the camera moves.

Never enable sRGB on roughness, metalness, or normal, compressed or not. That is a color-space error, not a codec error. The PBR map guide lists which maps are linear.

What artifacts mean in PBR

Albedo blocks change perceived color and can break energy conservation if dark dust becomes blotchy. Normal blocks change slope; you get wavy highlights on flat tiles. Roughness blocks create shimmering spec, especially on wet or polished surfaces. Metalness should stay near 0 or 1; compression that smears a painted edge into 0.4 creates a dirty plastic rim.

Mitigations: pack roughness + metalness + AO into one BC7 or ASTC texture to cut samples; dilate metalness edges before compress; use a slightly higher ASTC rate on normals than on AO. Preview under a moving HDRI, not a still gray studio. Lighting setup: HDRI and PBR.

A practical shipping checklist

  1. Author and archive lossless (PNG). Compress only in the engine or a cook step.
  2. Set sRGB on albedo only.
  3. Normals: BC5 or equivalent. Confirm DirectX versus OpenGL separately from compression.
  4. Compare memory: four 2K BC7 maps still beat one uncompressed 4K albedo.
  5. Play a 10-second camera truck across the floor. If sparkle appears, raise roughness codec quality or lower normal intensity, not sample count.

More real-time material notes are on the blog. Compression is a material decision, not only an engineering toggle.

Frequently asked questions

Which compression should I use for PBR albedo?

BC7 on desktop (or BC1 if memory is critical and the surface is low-contrast). ASTC 6×6 or 8×8 on mobile. Avoid heavy JPEG-style artifacts on albedo that must stay energy-conserving under GI.

Can I compress normal maps the same way as albedo?

No. Use a normal-aware format (BC5 on desktop, ASTC with care on mobile). BC1/DXT1 on normals causes banding and wrong slopes. Never run sRGB on a normal.

Does compression replace choosing the right resolution?

No. A compressed 4K floor can still blow the budget. Pick 1K–2K for most real-time props first, then compress. See Locker3d’s resolution guide before you keep 4K copies in a game pack.