
A roughness map is a single-channel greyscale image that tells the renderer how sharply light should reflect off every pixel of a surface. Black means a mirror — perfectly smooth, sharp reflections. White means a chalkboard — fully diffuse, no reflection. Everything else is somewhere on that spectrum, and almost every real material lives between the two ends.
Roughness is what separates a polished marble countertop from a weathered concrete slab. Same base colour, same normal map, same lighting — change the roughness and the surface stops being a piece of stone and starts being a different piece of stone.
How roughness actually works
Under the hood, PBR shaders use microfacet theory: every surface is modelled as a sea of microscopic mirrors. A low roughness value means those mirrors line up — so a single incoming light ray bounces in one direction and the reflection is sharp. A high roughness value means the mirrors point everywhere — so that same ray bounces in a thousand directions and the reflection blurs into ambient light.
You don’t set this per pixel manually. You author one greyscale texture that varies across the surface, and the renderer does the per-pixel maths for you.

The biggest mistake: sRGB vs linear
Roughness is data, not colour. If the renderer reads it through an sRGB curve (designed to brighten midtones for human perception), every value above zero gets pushed slightly brighter — which in roughness terms means slightly more matte. The whole material drifts toward chalky. Sphere should be glossy, looks like a billiard ball that’s been chewed on.
Import roughness as linear (Non-Color in Blender, sRGB unchecked in Unity, by default in Unreal). This is the single setting that fixes more “why does my material look flat” bug reports than any other.
Roughness in the metalness workflow
Modern PBR uses metalness + roughness instead of the older specular + glossiness. Roughness comes alongside three companion maps:
- Albedo — base colour, no lighting baked in.
- Normal — surface direction, fakes bumps.
- Metalness — is this pixel metal or dielectric?
- Roughness — how blurry are the reflections?
For convenience these get packed into a single RGBA file in some engines:

Packed ORM textures
Unreal and glTF (and most modern Unity setups) expect a packed ORM texture where Red = AO, Green = Roughness, Blue = Metalness. One file, three channels, smaller VRAM footprint than three separate greyscale files.
If your packer drops roughness into red or blue instead, the engine reads AO or metalness as roughness and the material looks wrong everywhere — usually too matte and too metallic, or weirdly chalky. Always check channel order before debugging anything else.

Real-world roughness values
Rough rule of thumb, sit anywhere in these ranges and you’ll read as believable:
- Polished chrome — 0.00 to 0.10
- Brushed metal — 0.20 to 0.40
- Painted plastic — 0.30 to 0.50
- Weathered wood — 0.60 to 0.80
- Fresh concrete — 0.70 to 0.90
- Raw clay or chalk — 0.90 to 1.00
Real surfaces almost never sit at pure 0 or pure 1 — nature has a slightly softer touch than that. If a roughness map is a solid black or solid white, you’ve got a constant value and could replace the texture with a single float.
Three ways to make a roughness map
- Paint it. In Substance Painter, mask the surface into shiny and rough zones and paint values per material. Full creative control; takes the longest.
- Derive it from a photo or albedo. Use the luminance of a photo, an inverted height map, or a desaturated and tone-corrected albedo as a rough first pass. Clean up the result so the values match real materials.
- Craft it from a text prompt with AI. Describe the surface in plain language and let CraftPBR produce a full PBR set — albedo, normal, roughness, AO, metalness — coherent with each other in under a minute.

Debug checklist when roughness looks wrong

- Is the map imported as linear / non-colour?
- If packed: is roughness in the green channel of an ORM texture?
- Are the values in a plausible real-world range (0.1–0.9)?
- Does the metalness map agree — pure metal pixels need low roughness, mixed pixels need higher?
- Is your environment HDR providing any reflection at all? A flat-grey skybox produces flat-grey reflections regardless of roughness.

Key takeaways
- Roughness controls reflection sharpness, not colour
- Always import as linear, never sRGB
- In a packed ORM file, roughness lives in the green channel
- Real materials sit somewhere between 0.1 and 0.9 — pure 0 and pure 1 look fake
- Roughness wrong is the #1 reason metals look like plastic