KUCRAFT / THE REPAIR CORNERFree stool preview

BLENDER TO GODOT · WORKED EXAMPLE

Three models.
One material.
One atlas.

Separate exports do not have to mean separate materials. This small, reproducible example uses Godot’s own import settings to share a material and preserve its edits when the geometry changes.

Tested 3 October 2026 · Blender 4.5.14 LTS · Godot 4.7.2 Standard · Linux x86_64

Original test meshes, source, scripts and results. 140,503-byte ZIP · SHA-256. No account, add-on or email required.

THE IMPORTANT DISTINCTION

Sharing a resource and removing duplicate files are different jobs.

Our three GLB files contain the same tiny atlas. Extracting their materials into one shared folder makes all three models use one loaded material and one texture. Godot still extracts three PNG files. Exporting separate glTF files that refer to one external atlas avoids those extra images in this example.

What the test actually measured

Three simple meshes—a floor, a wall and a post—use the same named material and atlas. The inspection script keeps all three imported scenes loaded together and counts distinct material and texture resource instances.

Initial import of the same three meshes
SetupLoaded materialsLoaded texturesPNG files in project
GLB, default import333
GLB, Extract Once to a shared folder113

Read the recorded results (JSON). These are resource identities and source-file counts. This test does not measure GPU memory, frame rate, draw calls or the size of an exported game.

NATIVE WORKFLOW

Keep the atlas external. Give the material a shared home.

  1. Use one deliberate material identity in Blender.

    Assign the same material to the meshes that should share it. The fixture uses SharedAtlas with one image texture. Keep that name stable during geometry revisions. Different-looking materials should have distinct names.

  2. Export separate glTF files with one external image.

    The supplied example exports each mesh as glTF Separate: a .gltf file, its .bin geometry and a reference to textures/atlas.png. Preserve those relative paths when moving the files. This avoids embedding a copy of the image in every GLB.

  3. Point each model at the same material folder in Godot.

    Set Materials → Extract to Extract Once, use the text format, and set Extract Path to res://materials. Reimport. In this fixture, all three imports resolve to res://materials/SharedAtlas.tres. The downloaded projects already contain the tested settings.

    These are Godot’s native material extraction options. Extract and Overwrite is a different choice: it replaces the material during reimport.

  4. Edit the external material and check the reimport.

    Change SharedAtlas.tres, then revise and re-export a mesh. Inspect an instance of the imported model in your scene. Godot’s Advanced Import preview can still show the source material rather than your external override; see its material extraction documentation.

The settings used by the reproducible fixture

For a new test project, the harness sets the following scene importer defaults before the first import. For existing assets, change their import settings and reimport them.

[importer_defaults]
scene={
  "materials/extract": 1,
  "materials/extract_format": 0,
  "materials/extract_path": "res://materials"
}

Material edits survive the geometry revision

Both the GLB and external-atlas glTF cases pass the same check. The test changes material roughness to 0.123, then replaces the wall with a taller export: its imported height grows from 2.0 to 2.5 metres.

The archive includes the before-and-after evidence and the scripts used to produce it.

Names and overrides need care

A renamed material needs remapping. Godot documents this boundary. Keep the old external material and associate the renamed source material with it in Advanced Import Settings. Do not assume a rename will preserve the relationship automatically.

One name must not mean two different materials. A shared extraction folder is useful when the materials are intentionally the same. Give unrelated materials different names or map them explicitly.

This is a small import test. It uses simple opaque textured meshes and headless resource inspection. The harness writes native settings and runs the real importer; editor button interaction was not tested. It is not a rendered appearance test, a large-scene performance benchmark, or a test of every material feature. Other Godot/Blender versions and operating systems are untested.

REPRODUCE THE RESULT

Inspect the files. Run the comparison.

The ZIP includes a README with the exact entry points and tool requirements, the original fixture generator, Godot inspection scripts and recorded results. Blender and Godot are not bundled.

Run the comparison on Linux

From the extracted folder, using the tested Blender and Godot versions:

python3 scripts/run_pilot.py all \
  --godot "/path/to/Godot" \
  --blender "/path/to/blender" \
  --output-root fresh-run
python3 scripts/account.py fresh-run

Use a new output folder. The harness uses headless execution, restricts its work to CPU cores 0 and 1 at low priority, and disables GPU backends. Those CPU IDs must be available on your Linux host. See README.txt for the full method and limitations.

Download the free example

Fixture and script licence: MIT; see LICENSE.txt inside the ZIP. This is a separate teaching example; the Repair Corner stool has its own asset licence.