Unreal Engine 5 PBR material setup is a texture-import problem as much as a graph problem. If sampler types and sRGB flags are wrong, Lumen will light a “correct” graph and still look wet, flat, or purple. This guide walks through a metalness-roughness material you can instance across an environment, including ORM packing and when 1K versus 4K is worth it.

Import maps with the right compression

Drop albedo, roughness, normal, and metalness into the Content Browser. Open each Texture asset. Albedo stays sRGB on, compression Default (DXT1/BC1 or BC7). Roughness, metalness, and AO: sRGB off, compression Masks or Default with sRGB unchecked. Normal: Texture Group Normalmap, sRGB off; Unreal expects DirectX-style normals (green channel down). If a pack is OpenGL, check Flip Green Channel. Name files consistently, for example T_Wall_Concrete_D, _N, _R, _M, so you can find them when building material instances. Locker3d is a free CC0 PBR library—download a set from concrete or metal and import those four maps first.

Wire the material graph

Create a Material, set Shading Model to Default Lit and Blend Mode to Opaque for solid surfaces. Add Texture Sample nodes (or Texture Sample Parameter so instances can swap maps). Connect albedo RGB to Base Color. Connect roughness to Roughness. Connect metalness to Metallic. Connect the normal sample to Normal. Leave Specular near 0.5 unless you have a measured reason to change it. For subsurface materials (skin, wax) you would switch shading models; wood, plaster, and steel stay Default Lit. If you have a height map, use it with a BumpOffset or parallax node for cheap depth, or with Nanite displacement only after you have tested silhouette cost.

  • Base Color: albedo, sRGB
  • Roughness: grayscale, linear
  • Metallic: grayscale, linear, mostly 0 or 1
  • Normal: BC5, sRGB off
  • Ambient Occlusion: plug into Ambient Occlusion, not Base Color, when using baked lighting or Lumen with AO

ORM packing and material instances

Packing AO, roughness, and metalness into one RGB texture (often called ORM or ARM) cuts sampler count. Convention varies: many studios use R = AO, G = roughness, B = metalness. Document yours on the material comment node. In the graph, split the packed sample and wire each channel. Parent materials should expose parameters: texture objects, a roughness multiply, normal intensity, and UV tiling (a Multiply on Texture Coordinate). Create Material Instances for each surface so artists never duplicate the whole graph. That is how a hallway of wood variants stays cheap to maintain.

Color space and lighting checks

The fastest UE5 sanity check is a gray MidGray / 18% sphere next to your material under an HDRI or Sky Atmosphere. If your concrete is darker than real concrete, the albedo may have baked AO or the texture may be linear when it should be sRGB. If metal looks like plastic, Metallic is not reaching 1 or the albedo is too bright (metals should be darker in base color). If the surface looks oily, roughness is too low after an sRGB mistake. For map theory, see what PBR textures are. If you author maps in Blender first, follow the Blender apply guide so exports match Unreal’s metalness workflow.

1K, 2K, 4K, Nanite, and Lumen

Nanite reduces geometry cost; it does not make 8K textures free. Use 1K on pipes, switches, and distant trim. Use 2K for most modular walls. Use 4K on first-person floors and hero props the camera lingers on. Enable Virtual Texture Streaming on large unique maps, not on every 512 tile. Lumen reads roughness and metalness seriously: a 0.04 roughness metal will firefly. Keep roughness a little higher for real-time unless you are doing a product shot. Locker3d maps are CC0, so you can ship them in a commercial Unreal project without attribution; read CC0 rules and browse the full texture catalog. Beginners can start at PBR textures for beginners. Extra engine notes are on the blog.

Frequently asked questions

How do I set up a PBR material in Unreal Engine 5?

Import albedo, roughness, normal, and metalness. Create a Material, plug albedo into Base Color, roughness into Roughness, metalness into Metallic, and the normal sample into Normal. Disable sRGB on data maps.

What does sRGB mean on an Unreal texture?

sRGB is the color encoding for albedo (and most UI). Roughness, metalness, ambient occlusion, and normals must have sRGB off so Unreal samples them linearly.

Should I use 4K textures on every Unreal mesh?

No. 1K suits trim and distant LODs, 2K is the real-time default, and 4K is for hero assets or first-person surfaces. Virtual Texturing helps, but memory still matters.