The Blender to Godot 4.6
3D Asset Pipeline

An interactive guide to creating 3D models in Blender and importing them into your Godot game. Covers workflows for weapons, characters, vehicles, buildings, foliage, and more.

Blender 4.x / 5.0 Godot 4.6 glTF 2.0 PBR Materials Skeletal Animation LOD & Optimization
01 — Export Formats

Pick the right format for your pipeline

FormatAnimationsPBRSkeletonsBest For
glTF 2.0 (.glb) RECOMMENDED✓ Yes✓ Yes✓ YesPrimary pipeline format — use this
.blend (direct)✓ Yes✓ Yes✓ YesSolo rapid iteration only
FBX✓ Yes⚠ Partial✓ YesThird-party / Mixamo assets
OBJ✗ No✗ No✗ NoSimple static props only
Collada (.dae)Legacy — avoid for new projects
Why glTF 2.0 wins

glTF 2.0 is an open Khronos Group standard with native support in both Blender and Godot. A single .glb file carries meshes, PBR materials, skeletons, animations, morph targets, vertex colors, multiple UV maps, cameras, and lights. It uses meters and Y-up — matching Godot's coordinate system exactly. Blender Studio chose it over direct .blend import for their production game DOGWALK due to better pipeline control.

Direct .blend import: tradeoffs

Godot silently invokes Blender's glTF exporter in the background. Requires Blender installed on every team member's machine. No control over export settings. Won't work on Android/web editors. Best for solo rapid iteration where save-in-Blender → auto-reimport-in-Godot speed matters.

FBX: the 100× scale gotcha

Godot 4.3+ includes a native ufbx importer (no more FBX2glTF dependency). Blender exports FBX at 100× scale by default (1 cm units). Fix: set "Apply Scalings" to "FBX Units Scale" in the export panel. Useful for Mixamo animations and third-party FBX content.

02 — Blender Export Settings

Get it right before you export

⚠ Critical Pre-Export Step

Select everything (A), then Ctrl+A → All Transforms. Unapplied transforms — especially on armatures — are the #1 cause of deformation bugs and scale issues in Godot. Also verify normals: Viewport Overlays → Face Orientation (blue = correct, red = flipped).

Optimal glTF Export Settings

Format.glb (Binary)Single file, compact, no loose textures
+Y Up✓ EnabledMatches Godot's Y-up coordinate system
Normals✓ EnabledRequired for correct shading
Tangents✓ EnabledRequired for normal maps to work
Apply Modifiers✓ EnabledExports final geometry (Mirror, Subsurf, etc.)
MaterialsExportPreserves Principled BSDF setup
NLA Strips✓ EnabledEach strip → separate animation in Godot
Shape Keys✓ If usedExports blend shapes / morph targets
Deforming Bones Only✓ EnabledAvoids IK helper bone artifacts
💡 Forward Direction Fix

Blender's front face is -Y, which maps to +Z in Godot (characters appear backward). Either model facing +Y in Blender, or rotate the root node 180° on Y in a Godot inherited scene.

💡 Auto-Looping Trick

Name your NLA strip with a -loop suffix (e.g., Walk-loop) and Godot will automatically enable looping on import.

03 — Godot Import Workflow

From .glb file to game-ready scene

1

Drop files into your project

Copy .glb files into your Godot project's res:// folder (e.g., res://assets/models/). Godot auto-detects and creates .import metadata files.

2

Configure import settings

Click the file in FileSystem → use the Import dock for basic settings. Double-click or click "Advanced..." for per-object material, mesh, and animation control.

3

Create an inherited scene

Right-click the imported file → "New Inherited Scene". This is mandatory — imported scenes get overwritten on reimport. Your inherited scene preserves all additions.

4

Add game logic

In the inherited scene: add collision shapes, scripts, particles, audio, and extra nodes. Save as .tscn — this is your working game asset.

5

Iterate safely

Re-export from Blender → overwrite the .glb → Godot reimports automatically. Your inherited scene updates while keeping all your game-specific additions.

⚠ Never Edit Imported Scenes Directly

Imported 3D files are regenerated on every reimport. All direct edits will be destroyed. Always use the inherited scene workflow above.

Blender Naming Conventions → Auto Node Creation

Add these suffixes to object names in Blender and Godot automatically creates the corresponding nodes on import:

SuffixGodot CreatesUse Case
-colStaticBody3D + trimesh collisionComplex static collision
-convcolStaticBody3D + convex collisionSimpler, faster collision
-colonlyCollision only (mesh removed)Invisible barriers
-rigidRigidBody3DPhysics objects
-vehicleVehicleBody3DVehicle chassis
-wheelVehicleWheel3DVehicle wheels
-navmeshNavigationMeshAI pathfinding
-occOccluderInstance3DOcclusion culling
-noimp(skipped entirely)Blender-only helpers
04 — Materials & Shaders

PBR materials that actually transfer

Key Rule

The only Blender shader node that glTF reads is Principled BSDF. It maps directly to Godot's StandardMaterial3D.

These Principled BSDF channels transfer automatically via glTF → Godot:

Blender ChannelGodot PropertyNotes
Base ColorAlbedoColor + texture
MetallicMetallicValue + texture (blue channel of ORM)
RoughnessRoughnessValue + texture (green channel of ORM)
Normal MapNormal MapOpenGL convention (+Y up) — no flip needed
EmissionEmissionStrength > 1.0 enables HDR bloom
AlphaAlphaRequires correct blend mode
Ambient OcclusionAO (Red channel)Packed into ORM texture R channel

Procedural textures (Noise, Voronoi, Wave), color ramps, math nodes, and custom node groups do not export. You must bake them:

1

Create target textures

Add Image Texture nodes for each channel: Diffuse, Roughness, Metallic, Normal, Emission, AO.

2

Bake in Cycles

Select the target node, set bake type (Diffuse for color, Roughness, etc.), and bake. Use 1024×1024 or 2048×2048 depending on detail needs.

3

Rewire to clean Principled BSDF

Create a new clean Principled BSDF using only your baked image textures. This is what glTF will export.

Connect the Image Texture Alpha output to Principled BSDF Alpha input. The Blend Mode controls behavior:

ModeBehaviorPerformance
OpaqueNo transparencyFastest
Alpha ClipBinary cutoff (fully transparent or opaque)Fast — prefer this for leaves, fences
Alpha BlendGradual transparencyExpensive — use sparingly

For effects beyond StandardMaterial3D:

1

Convert material

In Godot, right-click any imported material → "Convert to ShaderMaterial" to generate editable shader code.

2

Save externally

Save the converted shader as a separate .gdshader resource to prevent reimport from overwriting it.

3

Assign in inherited scene

Apply custom shaders in your inherited scene, not on the imported asset.

05 — Animation Pipeline

NLA strips to AnimationTree

Each NLA strip in Blender becomes a separate animation in Godot's AnimationPlayer. The recommended workflow:

1

Create Actions in Blender

Make a separate Action for each animation (Idle, Walk, Run, Attack, etc.).

2

Push to NLA strips

Open the NLA Editor, push each Action down as a named strip. Strip names = animation names in Godot.

3

Bake IK constraints

Object → Animation → Bake Action. glTF doesn't support runtime IK — only baked keyframes.

4

Export with NLA Strips enabled

In the glTF export panel, check "NLA Strips". Each strip exports as a separate Godot animation.

💡 Separate Files Strategy

Blender Studio recommends: character mesh/skeleton in one file, animations in separate files imported as AnimationLibrary. Enables modular, reusable animation sets.

Godot 4.x supports animation retargeting via BoneMap resources and the SkeletonProfileHumanoid preset:

1

Import target model

Import your character model with its skeleton.

2

Assign BoneMap

In Advanced Import Settings, create a BoneMap resource.

3

Map bones to humanoid profile

Map your skeleton's bone names to the standardized humanoid profile names.

4

Share animation libraries

Any model using the same profile can now share AnimationLibrary resources.

⚠ Rest Pose Must Match

Mismatched rest poses (T-pose vs A-pose) are the primary cause of retargeting failures. Ensure source and target use the same rest pose convention.

Blender Shape Keys export as morph targets in glTF and import as blend shapes in Godot.

Enable "Shape Keys" in the glTF export Data tab. Access in code:

mesh_instance.set("blend_shapes/Smile", 0.75)
mesh_instance.set("blend_shapes/Blink_L", 1.0)
Known Issue

Shape keys can behave unpredictably when Blender modifiers (Mirror, Subdivision) are active during export. Apply modifiers first if you encounter issues.

Root motion is supported via AnimationMixer (Godot 4.2+):

# In your CharacterBody3D script:
var root_pos = anim_tree.get_root_motion_position()
var root_rot = anim_tree.get_root_motion_rotation()
velocity = root_rot * root_pos / delta
move_and_slide()

Set the root_motion_track property in AnimationTree to the root bone. Character should animate "in place" with the root bone carrying translation data.

06 — Asset-Type Workflows

Specific guides by asset category

Rigging & Export

  • Use Blender's Rigify addon for a game-compatible rig with deform + control bones
  • Only deforming bones export — bake IK-driven animations first
  • Clean weight painting: Weights → Clean, threshold ~0.01
  • Keep to 4 bone influences per vertex for maximum compatibility
  • Separate meshes (body, hair, clothes) parented to one armature for mix-and-match

Recommended Bone Counts

PlatformBone Count
Mobile20–30 bones
Standard Desktop50–70 bones
Detailed (fingers + face)Up to 120 bones

Attaching Equipment in Godot

# Add as child of Skeleton3D:
var attachment = BoneAttachment3D.new()
attachment.bone_name = "RightHand"
skeleton.add_child(attachment)
# Then add weapon as child of attachment
attachment.add_child(weapon_instance)

Origin & Export

  • Set origin to the grip/handle: Object → Set Origin → Origin to 3D Cursor
  • Export each weapon as a separate .glb for independent loading
  • Keep weapons as separate scenes for inventory systems and runtime swapping

In Godot

# Runtime weapon swap:
var old_weapon = hand_attachment.get_child(0)
if old_weapon: old_weapon.queue_free()

var new_weapon = preload("res://weapons/sword.tscn").instantiate()
hand_attachment.add_child(new_weapon)

Modular Design

  • Design on a consistent grid (1m, 2m, or 4m increments)
  • Snap pieces perfectly at boundaries for seamless tiling
  • Use Blender naming conventions (-col, -convcol) for automatic collision
  • Generate UV2 for lightmapping: set Meshes → Light Baking to "Static Lightmaps" in import, or pre-unwrap UV2 in Blender via Smart UV Project

GridMap Workflow

Convert scenes to MeshLibrary via Scene → Convert to MeshLibrary. GridMap is the 3D equivalent of TileMap. Godot 4.6 added Bresenham line painting for smoother tile placement.

VehicleBody3D Setup

  • In Blender: model body and each wheel as separate objects
  • Set wheel origins at axle centers
  • Set body origin low for a low center of gravity
  • Front wheels: use_as_steering = true
  • Drive wheels: use_as_traction = true

Key Properties Per Wheel

wheel.wheel_radius = 0.35
wheel.wheel_rest_length = 0.15  # suspension travel
wheel.suspension_stiffness = 50.0
wheel.wheel_friction_slip = 1.5
💡 Arcade Alternative

For arcade-style driving, use an invisible RigidBody3D sphere with the car mesh placed at the sphere's position. Much simpler than full VehicleBody3D physics.

Foliage with MultiMeshInstance3D

  • Render thousands of instances in a single draw call
  • Use the editor's "Populate Surface" tool or populate programmatically
  • Split instances into spatial cells for better frustum culling

Trees: LOD Strategy

  • Create 3–4 LOD levels: full detail → 50% → 25% → billboard impostor
  • Set visibility ranges on each level
  • Use Alpha Scissor for leaves (cheaper than Alpha Blend)
  • Set cull_mode = CULL_DISABLED for double-sided leaf cards

Wind Shader Approach

// Vertex shader for wind — displace by UV.y (height)
void vertex() {
    float wind = sin(TIME * 2.0 + VERTEX.x * 0.5) * 0.3;
    VERTEX.x += wind * UV.y; // stronger at top
    VERTEX.z += wind * UV.y * 0.5;
}
07 — Optimization

LOD, culling & polygon budgets

Auto-Generated Mesh LOD

Godot 4.x auto-generates LODs on import using meshoptimizer (enabled by default). Uses a 1-pixel screen-space threshold — perceptually lossless. Godot 4.6 improved LOD generation to better preserve mesh shape for multi-part objects. Adjust globally: Rendering → Mesh LOD → Threshold Pixels, or per-instance with the LOD Bias property.

Visibility Ranges (Manual LOD/HLOD)

Set begin/end distances and fade margins on GeometryInstance3D nodes. The Visibility Parent property enables HLOD: individual meshes replaced by a combined mesh at distance.

Occlusion Culling

Uses raster-based depth testing via OccluderInstance3D. Most effective for indoor scenes with walls/rooms. Less beneficial outdoors. Does not support dynamic occluders.

Interactive Polygon Budget Calculator

Characters
1–5K
1–5K tris
Env Props
0.1–2K
100–2K tris
Total Visible
<100K
< 100K
💡 GPU Instancing

MultiMeshInstance3D handles GPU instancing for identical objects (grass, trees, crowds). Godot's Forward+ renderer also performs automatic instancing for MeshInstance3D nodes sharing the same mesh and material. Godot 4.6 made 3D texture imports ~2× faster via GPU-based Betsy compression.

08 — Blender Addons

Tools that streamline the pipeline

 Blender to Godot 4 Pipeline Addon Paid — v2.5.5

The most comprehensive Godot-specific addon. One-click export with hot reload, collision shape setup (box, capsule, convex, trimesh), multimesh config, NavMesh generation, script parameter passing. Matching Godot plugin handles import. Supports Blender 3.6–5.0.

 ACT: Game Asset Creation Toolset Free

Batch export to glTF, origin alignment tools, LOD naming, UV batch tools, texel density checking, palette baking for low-poly art. Highly recommended for any game asset workflow.

 Principled-Baker Free

Bakes PBR textures from complex node setups with minimal clicks. Essential for converting procedural materials to game-ready image textures before glTF export.

 Rigify Built-in

Blender's built-in character rigging addon. Generates game-compatible rigs with deformation and control bones. The standard for game-ready character rigs compatible with Godot retargeting.

 Sprytile Free

Tile-based 3D scene building for pixel art aesthetics. Paint tiles directly onto 3D geometry using a tileset texture. Great for retro-style games.

 Other Useful Addons
  • DECALmachine (~$50) — Detail decals for hard-surface models that bake to PBR
  • Vertex Oven — Fast vertex-color AO baking without UV unwrapping
  • Texel Density Checker — Consistent texture resolution across models
09 — Export Checklist

Before you hit export every time

Click items to track your progress. Resets on page reload.

Applied all transforms (Ctrl+A → All Transforms)
Verified face normals (blue outward in Face Orientation overlay)
No objects with negative scale
Only Principled BSDF materials (or baked procedurals)
All textures saved as PNG/JPEG files
UV maps clean with no overlapping (unless intentional)
Animations pushed to NLA strips with descriptive names
IK constraints baked to keyframes
Naming suffixes added for collision (-col, -convcol, etc.)
Origins set correctly (grip for weapons, center for props)
Modeled at real-world scale (1 Blender unit = 1 meter)
Weight painting clean (max 4 influences, cleaned at 0.01)
Exported as .glb with Normals + Tangents enabled
Created inherited scene in Godot (not editing import directly)