LOD and texture streaming keep PBR materials readable up close without loading every 4K map at once. Mesh LOD reduces triangles. Streaming and virtual textures reduce which mips sit in VRAM. Both fail if albedo is in the wrong color space or if roughness is packed as sRGB. This guide is a practical budget for games using free CC0 PBR textures from Locker3d.

Mesh LOD versus texture LOD

Build mesh LODs so silhouettes hold: LOD0 full, LOD1 ~50% tris, LOD2 ~25%, an impostor last. Texture LOD is mostly automatic via mipmaps: a 2048 albedo also stores 1024, 512, 256. The GPU picks a mip from screen coverage. If you disable mips “to keep sharpness,” you pay cache thrash and shimmer. Generate mips for every map except rare UI atlases.

Normal maps need good mip filtering or detail dies into gray-blue. In Unreal, enable normal mip generation; in Unity, set the texture type to Normal map. Color space: albedo sRGB; normal, roughness, metalness, AO linear. See what PBR textures are.

A resolution budget that actually fits

Pick resolution from how many pixels the surface covers, not from the folder name “4K.”

  • Hero / first-person — 4K albedo + normal, 2K packed ORM. Stream to 2K when the camera backs off.
  • Standard props — 2K all maps, or 2K color/normal and 1K ORM.
  • Trim, bolts, distant trim — 1K or 512.
  • Mobile / VR — cap most materials at 2K; prefer 1K for anything not in arm’s reach.

Tileable concrete, wood, and floor from Locker3d can stay 2K and scale in UV. Unique baked characters should drop texture size with mesh LOD, or streaming will still upload a 4K that no longer matches the silhouette.

Pack maps so streaming has fewer files

One packed texture is cheaper to stream than three. A common layout: R = AO, G = roughness, B = metalness (ORM), all linear, no sRGB flag. Albedo stays a separate sRGB texture. Normal stays separate (BC5 or equivalent). Do not pack a normal into RGB with roughness unless your shader expects that exact layout.

In Blender you can preview unpacked maps first — apply PBR textures in Blender — then pack in Substance 3D Painter, Channel Packer, or a simple compositor. Export 8-bit PNG or TGA masters; let the engine compress to BC7/BC5 or ASTC.

Streaming, virtual textures, and pop-in

Unreal’s virtual texturing and Unity’s streaming mipmaps load only the tiles or mips on screen. They need UVs that do not overlap wildly and materials that do not sample twenty unique 4Ks per pixel. Prefer a small set of tileable CC0 surfaces — metal, stone, wood — plus decals for unique dirt. Set a streaming pool (for example 200–400 MB on console) and watch for pink or blurry mips: that is pool starvation, not a bad albedo.

Keep roughness in linear mips. If ORM is accidentally marked sRGB, distant floors become too shiny or too dull as mips shift.

CC0 libraries and production checklists

Locker3d textures are CC0: use them in commercial games, pack them, compress them, and ship them without attribution. You still should not claim you authored the originals. Read CC0 textures: what you can and cannot do, then pull bases from the texture catalog. Checklist before a level ships: mips on, ORM not sRGB, hero 4K streamed, trim at 1K, no 8K in real-time. More engine-oriented articles are on the blog.

Frequently asked questions

What resolution should each LOD use for PBR textures?

Hero meshes: 4K on LOD0, 2K on LOD1, 1K on LOD2. Props: 2K then 1K then 512. Keep albedo sRGB and packed ORM (occlusion, roughness, metalness) in linear. Do not drop the normal before you drop albedo.

Is texture streaming the same as mesh LOD?

No. Mesh LOD swaps geometry. Texture streaming (and virtual texturing) loads mip levels based on screen size. You still need correct color space and packed maps, or streamed mips will look muddy or too shiny.

Can I stream CC0 textures from Locker3d in a commercial game?

Yes. Locker3d textures are CC0: commercial use, no attribution required. Convert them to your engine’s streaming format (BCn/ASTC, packed ORM) and keep a license note in your art bible for the team.