Skip to content
← Back to Blog 3d-modeling

Weighted Normals in Blender: Fix Hard-Surface Shading Artifacts Before Engine Export

By BitSoul3D5 min read157 views

Hard-surface props look convincing in Blender's viewport, but once they land in Unreal, Unity, or Godot they develop dark patches and faceted shading on angles that should read perfectly clean. Nine times out of ten the culprit is normal vector averaging—and weighted normals is the fix. This guide covers the exact modifier setup in Blender, how to diagnose artifacts before export, and what to check in each engine on import.

Weighted Normals in Blender: Fix Hard-Surface Shading Artifacts Before Engine Export

What Are Weighted Normals and Why They Break Hard-Surface Assets

In a standard mesh, each vertex normal is calculated by averaging the normals of every face it touches. On organic shapes this produces smooth, natural shading. On hard-surface props—crates, vehicles, machinery, modular walls—it creates dark gradient smears where flat surfaces meet sharp edges. The shading interpolates across 90-degree corners as if they were curved geometry.

Weighted normals solves this by giving more influence to the largest adjacent faces. The big flat top panel of a crate dominates the normal calculation for its boundary vertices, keeping the top face shading flat. A 90-degree corner reads as an abrupt, intentional edge break rather than a dark smear artifact. The visual result: flat surfaces that stay flat, hard edges that read as designed, and no unexplained dark patches on otherwise correctly textured geometry.

Standard averaged normals are fine for character meshes and terrain. For any asset with planar surfaces and deliberate hard edges—crates, sci-fi panels, vehicle chassis, architectural props—weighted normals are not optional. They should be the last step before every hard-surface GLB export.

What Are Weighted Normals and Why They Break Hard-Surface Assets — illustrated

Enabling Weighted Normals in Blender

Blender provides a dedicated modifier for this. The setup:

  1. Select your hard-surface mesh in Object Mode.
  2. Open the Modifier Properties tab and add a Weighted Normal modifier.
  3. Set Weighting Mode to Face Area (default) or Face Area and Angle for more aggressive correction on chamfered edges.
  4. Enable Keep Sharp — this preserves any existing sharp edge marks, which is critical if you've already used Mark Sharp to define hard edges manually.
  5. In Object Data Properties → Normals, enable Auto Smooth and set the angle to the same threshold used when marking sharp edges (typically 30°–60° for game assets).

The modifier must sit below any Bevel or Subdivision Surface modifier in the stack. Weighted Normal applied before bevel means the bevel's new geometry won't benefit from the weighting.

Batch-applying this across an entire prop kit in Blender's scripting editor:

import bpy

for obj in bpy.context.selected_objects:
    if obj.type != 'MESH':
        continue
    # Enable auto smooth
    obj.data.use_auto_smooth = True
    obj.data.auto_smooth_angle = 0.523599  # 30 degrees in radians
    # Add weighted normal modifier at bottom of stack
    mod = obj.modifiers.new(name="WeightedNormal", type='WEIGHTED_NORMAL')
    mod.mode = 'FACE_AREA'
    mod.keep_sharp = True

Diagnosing Shading Artifacts Before You Export

Before exporting GLB, verify the fix is working in Blender's viewport:

ProblemCauseFix
Artifact survives after modifierAuto Smooth disabledEnable Auto Smooth in Object Data Properties
Sharp edges still smearKeep Sharp not enabledEnable Keep Sharp in modifier
Modifier has no effectWrong stack orderMove Weighted Normal to bottom of stack
Entire mesh facetedAuto Smooth angle too lowRaise angle threshold to 30–60°
Inconsistent per-face resultsMixed normal directionsSelect All → Mesh → Normals → Recalculate Outside

GLB Export Settings That Preserve Weighted Normals

Weighted normals are stored as custom split normals in Blender. For them to survive GLB export intact:

  1. Open File → Export → glTF 2.0 (.glb/.gltf).
  2. Under Geometry, enable Apply Modifiers — this bakes the weighted normal modifier into the exported mesh data.
  3. Under Data → Mesh, confirm Normals is explicitly checked. This exports custom split normals rather than letting the importer recalculate from geometry.
  4. Disable Export Vertex Colors unless your asset requires them — they can conflict with normal data in some engine import pipelines.

Verify the export by reimporting the GLB into a fresh Blender session and checking face normals under the clay matcap. If faceted artifacts return on reimport, custom normals were not exported—recheck that Apply Modifiers and Normals are both enabled.

For teams sourcing game-ready hard-surface props, the BitSoul Marketplace ships assets with weighted normals already applied and verified, so engine import is predictable from day one.

Engine-Specific Normal Import Settings

Each engine has a flag controlling whether it uses the normals embedded in your GLB or discards them and recalculates at import. Getting this wrong nullifies everything done in Blender.

Engine-Specific Normal Import Settings — illustrated

Unreal Engine 5
In the Import dialog, set Normal Import Method to Import Normals and Tangents. In the Static Mesh editor, confirm Recompute Normals is unchecked in the Build Settings for each LOD. If normals are being recalculated anyway, disable the Recompute Normals option in the LOD chain settings.

Unity URP
Select the imported GLB asset, open Model → Normals in the Inspector. Set the drop-down to Import (not Calculate). Set Normals Mode to Unweighted. Tangents can stay on Calculate.

Godot 4
Godot 4 respects GLB normals by default. If the mesh was imported using an older scene with Generate Normals checked, open Advanced Import Settings and verify the normals source is set to From file under Meshes.

EngineSettingValue
Unreal Engine 5Normal Import MethodImport Normals and Tangents
UE5 Static Mesh LODRecompute NormalsUnchecked
Unity URPModel → NormalsImport
Unity URPNormals ModeUnweighted
Godot 4Normals sourceFrom file (default)

Weighted normals are one modifier away from eliminating the most common hard-surface shading complaint in any game engine. Apply the modifier, export with Apply Modifiers and Normals enabled, import with the engine's "use file normals" option active, and your props will read exactly as they did in the Blender viewport.

For hard-surface props, modular environment kits, and rigged characters with normals already dialed in, browse the BitSoul Marketplace — every asset includes GLB and FBX exports with engine-specific import notes.


Need drop-in assets for this workflow? Grab the 67-model Weapons Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: weapons

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)