Skip to Content
DocumentationFeaturesNormal Mapping

Normal Mapping

Normal Mapping perturbs the lit surface normal per pixel without adding geometry, so a flat plane can read as cracked stone or hammered metal. Genesis supports the standard URP tangent-space inputs and adds strength scaling, a secondary detail layer, and per-channel masking.

When to use it

  • Almost every Lit material — cheap shape definition without polygons.
  • Hero props that need close-up bump detail.
  • Stylized characters where a soft normal adds form without breaking the cel banding.
  • Terrain and rocks — usually paired with Triplanar Mapping.

How it works

Genesis samples _BumpMap, unpacks it from DXT5nm or BC5 to a tangent-space normal, scales the X and Y components by _BumpScale, and transforms the result into world space using the mesh’s TBN matrix. The world normal then drives every other lighting term — diffuse, specular, rim, MatCap, and SSS.

Properties

Inspector labelShader propertyTypeDefaultDescription
Normal Map_BumpMapTexture2DbumpTangent-space normal map. Import as Normal Map.
Normal Strength_BumpScaleFloat (0–2)1.0Multiplier on the XY components. 0 = flat, 2 = exaggerated.
Detail Normal_DetailNormalMapTexture2DNoneOptional secondary normal at detail tiling.
Detail Strength_DetailNormalScaleFloat (0–2)1.0Strength of the detail layer.
Detail Tiling_DetailNormalTilingVector4(8,8,0,0)Tiling (xy) and offset (zw) for the detail UV.
Normal Mask_NormalMaskTexture2DwhiteGreyscale mask restricting bump to regions.

Usage

  1. Author the normal in Substance, Blender, or xNormal and import it as a Normal Map in Unity.
  2. Assign it to the Normal Map slot. A strength of 1 matches the source; push to 1.5 for stylized exaggeration.
  3. For close-up shots, add a high-frequency Detail Normal at 5–10x tiling.
  4. Use a packed mask to restrict bump to specific regions — none on a smooth visor, full on the body.
material.SetTexture("_BumpMap", normalTex); material.SetFloat("_BumpScale", 1.2f); material.SetTextureScale("_DetailNormalMap", new Vector2(10, 10));

Tips & gotchas

  • Always set the import type to Normal Map, or Unity will not pack to DXT5nm and the green channel will look wrong.
  • BC5 is preferred for high-strength normals; DXT5nm shows banding past a strength of 1.3.
  • Procedural meshes need tangents — call mesh.RecalculateTangents() or import tangents from the FBX.
  • A single normal sample is cheap; the detail normal doubles the cost, so measure before shipping.
Last updated on