← Cheatsheets
Tags: textures, materials, pbr, albedo, normal, roughness, metallic, uv, game-dev
Last updated: 2026-06-27
Texture & Material Management Cheatsheet
Quick Reference
| Map | Channel(s) | What It Controls |
| Albedo / Base Colour | RGB | Surface colour (no lighting info) |
| Normal | RGB | Surface bumps/dents via light angle |
| Roughness | Single (R or G) | Micro-surface scattering (0=glossy, 1=matte) |
| Metallic | Single (R or G) | Metal (1) vs non-metal (0) |
| Ambient Occlusion | Single (R or G) | Self-shadowing in crevices |
| Height / Displacement | Single | Actual geometry offset (tessellation) |
| Emission | RGB | Self-illuminated areas |
PBR Map Reference
Albedo (Base Colour)
- Colour space: sRGB.
- Contains only flat colour — no shadows, no highlights, no ambient occlusion.
- Darkest value ~30–50 sRGB for non-metals, ~180–255 for metals.
- Common mistake: baked-in lighting ruins PBR response.
Normal Map
- Colour space: Linear (NOT sRGB).
- Encodes surface direction per pixel (tangent-space normals).
- Flat surface =
(128, 128, 255) in RGB.
- OpenGL vs DirectX:
- OpenGL — green channel points up (+Y).
- DirectX — green channel points down (-Y).
- Flip Y channel in engine if normals look inverted.
Roughness Map
- Stored in one channel (usually G in ORM, or R standalone).
- 0 (black) = perfectly smooth mirror reflection.
- 1 (white) = completely diffuse (rough).
- Values below 0.05 can cause firefly artifacts in some renderers.
Metallic Map
- Binary in most real-world cases — 0 or 1.
- Metals: albedo shows reflectance colour; no diffuse.
- Non-metals: albedo shows diffuse colour; reflectance is 4% (dielectric).
- Transition values (0.1–0.9) only for rust, dirt, oxidation.
Ambient Occlusion (AO)
- Greyscale, multiplied over diffuse/albedo.
- Darkens crevices where ambient light can’t reach.
- Often packed with Roughness + Metallic into ORM texture:
- R = Occlusion, G = Roughness, B = Metallic.
Height / Displacement
- For parallax occlusion mapping (POM) or tessellation.
- 0 (black) = lowest, 1 (white) = highest.
- 16-bit preferred to avoid visible stepping.
Packed Texture Formats
ORM (Occlusion-Roughness-Metallic)
| Channel | Map | Notes |
| R | Ambient Occlusion | Invert if baked as “cavity” map |
| G | Roughness | Unity Glossiness = 1 - Roughness |
| B | Metallic | 0 or 1 for most surfaces |
ARM (Unity Standard)
| Channel | Map |
| R | Metallic |
| G | Ambient Occlusion |
| B | — (unused or detail mask) |
| A | Smoothness (= 1 - Roughness) |
UV Tiling
Basic Tiling
U = horizontal repetition, V = vertical repetition.
A tile rate of (2, 2) repeats the texture 4× per face.
- Use seamless textures or visible seams will repeat.
- Common issue: obvious repeating pattern (add variation maps, macro-variation, or decals).
Texel Density
- Target: 512 px/m for mobile, 1024 px/m for PC, 2048 px/m for hero/first-person assets.
- Maintain consistent texel density across scene for uniform texture resolution.
texel_density = texture_resolution / object_world_size
UV Channel Usage
| Channel 0 (UV0) | Channel 1 (UV1) |
| Albedo, normal, roughness, metallic, AO | Lightmaps (baked lighting) |
| Tiled textures | Unique unwrap (no overlapping UVs) |
File Format Guide
| Format | Compression | Alpha | Best For |
| PNG | Lossless | Yes | Source assets, UI, sprites |
| TGA | None / RLE | Yes | Source assets, height maps |
| JPEG | Lossy | No | Albedo (no alpha needed) |
| EXR | Lossy/Lossless | Yes (HDR) | HDR environment maps, lightmaps |
| DDS | Block (BCn) | Varies | Runtime (GPU-native) |
| KTX2 | Basis Universal | Yes | Runtime (WebGL, mobile) |
| TIFF | Lossless | Yes | Archival, 16-bit height maps |
Engine-Specific Runtime Formats
| Engine | Preferred Format |
| Unity | ASTC (mobile), BC7 (PC), DXT5/BC5 (normal) |
| Unreal | .uasset auto-compresses on import |
| Godot | PNG for source, VRAM-compressed at import |
| Web | KTX2 (Basis Universal) or WebP |
Resolution Guidelines
| Asset Type | Max Resolution |
| Tiling environment texture | 2048×2048 |
| Hero prop / character | 2048×2048 |
| Background prop | 1024×1024 or 512×512 |
| Small prop / pickup | 512×512 or 256×256 |
| UI sprite sheet | 1024×1024 or 2048×2048 |
Common Mistakes & Fixes
| Problem | Cause | Fix |
| Normal map looks flat | Imported as sRGB | Set texture to Linear colour space |
| White seams at UV edges | No edge padding | Add 4–8px padding during bake |
| Shiny-looking metals are black | Albedo too dark for metal | Raise albedo >180 for metals |
| Textures blurry at distance | No mipmaps | Enable mipmaps in import settings |
| Visible tiling pattern | No variation | Add dirt map, macro-variation, or decals |
| Roughness looks wrong in engine | Inverted glossiness | Check: engine uses roughness or smoothness? |
Baking Checklist (from Blender / Substance)
- Set matching resolution across all maps.
- Ensure low-poly has non-overlapping UVs (UV0).
- Use cage or average normals for projection.
- Set max ray distance tight to the high-poly surface.
- Bake to 16-bit for normal and height maps.
- Check bakes by applying to low-poly with PBR shader in viewport.