PBR materials explained for furniture: what each texture map actually does
PBR (Physically Based Rendering) is the reason a 3D velvet sofa can look like velvet instead of painted plastic. It's a set of four texture maps that describe how light interacts with a surface — and getting all four right is the difference between a render buyers trust and one that looks "off" without them knowing why.
What PBR is (and why it replaced the old way)
Before PBR, 3D artists set a "diffuse colour" and a "specular colour" separately, and tweaked them until the result looked roughly right under one specific lighting setup. Change the lighting and the material broke. The material wasn't physically accurate — it was a per-lighting hack.
PBR describes how a surface physically behaves — how much light it absorbs, how rough its micro-surface is, whether it's a conductor (metal) or dielectric (everything else). Render it under any lighting and it looks correct, because the maths is physically grounded.
For furniture brands, this matters because buyers see your products under many different lighting conditions — trade show booths, home lighting, outdoor showrooms. A PBR material holds up across all of them.
Albedo map (base color)
The albedo map stores the intrinsic color of the surface — what it would look like under perfectly flat white light, with no shadows or reflections baked in.
- Common mistake: baking lighting or ambient occlusion into the albedo. This makes the material look correct under one light and wrong under every other.
- For fabric: photograph the swatch on an overcast day (soft, flat light) and use that as the base. Remove any directional shading in post.
- For wood: the albedo should show grain color but not sheen. Sheen is handled by roughness, not color.
- Resolution: 2048×2048 minimum for a seat cushion; 4096×4096 for a large sofa that will be shown close-up.
Roughness map
The roughness map controls how sharp or blurry reflections are. Black (0) = mirror smooth. White (1) = fully diffuse, like chalk. Most furniture materials live somewhere between 0.3 and 0.9.
| Material | Roughness range | Notes |
|---|---|---|
| Gloss lacquer | 0.05–0.15 | Near mirror; tiny spec highlights |
| Satin lacquer | 0.25–0.40 | Visible highlights, not sharp |
| Matte lacquer | 0.70–0.85 | Broad, soft highlights |
| Polished marble | 0.10–0.20 | Reflective, some variation across grain |
| Honed marble | 0.55–0.70 | No sharp reflections; soft sheen |
| Velvet | 0.75–0.90 + sheen layer | High roughness base; add sheen for nap |
| Brushed metal (brass) | 0.40–0.55 | Directional variation from brush marks |
| Full-grain leather | 0.45–0.60 | Mid-gloss, slight grain variation |
For velvet specifically: roughness alone isn't enough. Velvet has a sheen effect — the nap glows at glancing angles. This requires either a sheen extension in the GLB material (glTF 2.0 KHR_materials_sheen) or a carefully crafted normal map to simulate it.
Normal map
The normal map encodes surface micro-detail as pixel colors (RGB = XYZ direction offsets). It fakes geometry without adding polygons — a woven textile can look like it has thousands of tiny threads without a single extra triangle.
- For fabric: scan or photograph the swatch at high resolution and generate a normal map from the height data. The weave texture has to be in the normal map, not just the albedo.
- For wood: the grain raises slightly above the surface on real wood. A wood normal map should show this micro-relief.
- Common mistake: too-strong normal maps. An intensity of 1.0 can make a smooth leather look like bark. Dial down normal intensity until the relief looks right from the expected camera distances.
- Tile correctly. Normal maps tile differently from albedo maps. If the tile seams are visible, offset the tiling or use a larger texture.
Metalness map
In PBR metalness-roughness workflow (used by glTF/GLB), the metalness map is binary: 0 = dielectric (wood, fabric, stone, paint), 1 = conductor (steel, brass, gold, aluminium). Nothing in between — real materials are either one or the other.
Furniture-specific tips
- Match scan resolution to tile size. If a fabric tile covers 30×30 cm and your texture is 2048×2048, that's about 68px/cm — enough for most viewers. At 1× zoom in AR you may see pixelation; use 4096×4096 for AR-first products.
- Always check in multiple lighting environments. Open your GLB in three-point studio lighting, outdoor HDRI, and a dark interior HDRI before signing off. PBR should hold across all three.
- Velvet needs KHR_materials_sheen. The glTF extension is supported in model-viewer, Babylon.js, and Three.js r150+. Use it for any high-pile fabric.
- Leather vs vinyl tells in roughness variation. Real leather has non-uniform roughness across the surface — a roughness map with subtle noise looks right. Perfectly uniform roughness reads as vinyl.
The sheen extension was the unlock. We had the roughness right, the albedo right, the normal map right — and it still looked flat. Adding KHR_materials_sheen with a 0.45 sheen colour and 0.6 sheen roughness made the buyer say "that's it" in the first review.