Platforms

How to Optimize GLB Exports From Blender

Prepare a delivery collection, apply transforms and modifiers intentionally, control geometry and materials, export glTF, and validate the resulting GLB.

A clean Blender viewport does not guarantee a clean GLB. Export evaluates modifiers, triangulates faces, converts materials into the supported glTF model, splits vertices at attribute discontinuities, writes animations, and may embed images. The delivery artifact can have different counts, shading, and dependencies from the source scene.

Create a dedicated non-destructive delivery collection and inspect the exported GLB as the authoritative result.

Separate source and delivery scenes#

Keep sculpt, CAD import, scan, bake source, high-resolution images, and authoring helpers outside the collection exported for runtime.

A delivery collection should contain only:

  • meshes intended for the target;
  • required armature and animation;
  • supported materials and images;
  • deliberate lights or cameras if the product uses them;
  • named pivots and component hierarchy;
  • selected LODs or variants under a documented scheme.

Do not delete the high-detail source to make the file smaller. Duplicate or derive assets and preserve provenance. Use linked data carefully: editing a shared mesh in the delivery scene can change the source.

Export Selected Objects or Active Collection only after confirming hidden, disabled, and nested objects behave as expected. Reopen the GLB in a fresh file to catch accidental content.

Normalize scale, axes, and transforms#

glTF uses meters and a defined right-handed coordinate system. Blender also uses a right-handed system, but interface orientation and exporter conversion still need verification in the target.

Set dimensions against a known reference. Apply object scale when the pipeline requires clean (1,1,1) scale, but understand consequences for children, armatures, modifiers, and animation. Negative scale can reverse winding and tangent orientation.

Apply rotation and location only when the intended pivot and hierarchy remain. A door needs its hinge; a product turntable needs a stable center; a skeletal root needs consistent bind transforms.

Inspect transforms across parents. Correction empties can be valid but should have a documented role. Avoid chains created by repeated import/export conversions.

Test one 1-meter cube and axis marker through the full path before batch production.

Evaluate modifiers intentionally#

The exporter can apply supported modifiers as evaluated geometry. That can multiply triangles unexpectedly:

  • Subdivision Surface raises density by levels;
  • Mirror duplicates geometry and can affect UV/tangent handedness;
  • Array creates repeated copies;
  • Solidify adds inner surfaces and rims;
  • Bevel adds segments around many edges;
  • Geometry Nodes can realize large instance sets;
  • Decimate changes topology and attributes.

Record counts with modifiers evaluated. A subdivision level that turns 25000 triangles into 400000 should be an explicit close-view requirement.

Apply or preserve modifiers on a delivery duplicate for deterministic baking and triangulation. Keep the editable stack in the source.

For repeated geometry, prefer real instances when the export and target support them. Realizing 100 identical bolts produces 100 copies of vertex data unless the pipeline reconstructs instancing.

Clean geometry before decimation#

Remove exact duplicates, degenerate faces, loose artifacts, accidental internals, and unreachable components before applying lossy reduction.

Use Blender's cleanup and topology selections to report:

  • non-manifold edges and vertices;
  • boundaries and connected components;
  • duplicate positions and faces;
  • zero-area faces and zero-length edges;
  • inconsistent normals;
  • interior shells;
  • material slots by face count.

Do not merge by distance with an arbitrary threshold. In a meter-scale scene, 0.001 is 1 millimeter and can close designed gaps on a small product.

Classify open boundaries. Filling every hole can cap vents, sleeves, or doors. Keep a before/after count and visual diff.

Simplify for the camera#

The Decimate modifier provides Collapse, Un-Subdivide, and Planar-style modes for different structures. Ratio is based on triangles and does not guarantee visual quality.

Generate duplicates at several ratios such as 75%, 50%, 30%, 15%, and 8%. Compare at the closest target camera with fixed lighting.

Protect:

  • silhouette and holes;
  • thin semantic features;
  • hard edges;
  • UV seams and material boundaries where necessary;
  • deformation loops;
  • named component separation.

Collapse works broadly; Un-Subdivide can reverse regular subdivision patterns; Planar reduction can simplify flat hard-surface regions. The best mode depends on topology.

Inspect exported rendered vertices, not only Blender vertices. UV, normal, tangent, and material splits increase the GLB count.

Freeze triangulation before baking#

glTF delivery uses triangles. Quads and n-gons are triangulated. On non-planar faces, diagonal choice changes the surface and tangent interpolation.

Add and apply a Triangulate modifier on the delivery copy before normal-map baking when stable diagonals matter. Review n-gons and concave shapes explicitly.

Keep the resulting index topology unchanged after baking. Later decimation, welding, or exporter changes can invalidate tangent-space correspondence.

Compare flat shading and wireframe. Reject zero-area, inverted, and extreme sliver triangles where they cause problems.

Hash or record final triangle/vertex counts so tool upgrades cannot silently change triangulation.

Control normals and tangents#

Decide whether to export custom normals. Auto Smooth, sharp edges, weighted normals, and modifiers can make the Blender viewport look correct while the target recalculates differently.

Hard normal edges split rendered vertices. Mark only intended discontinuities. Coordinate UV seams with hard edges when practical.

For tangent-space normal mapping, generate compatible tangents from final positions, triangles, UVs, and normals. Blender and many runtimes use MikkTSpace-compatible behavior, but test the exact target.

Mirrored UV islands need correct tangent handedness. Use a moving light and an asymmetric test normal map.

If the target reliably generates tangents, omitting them can save 16 float bytes per vertex before compression, but adds runtime work and possible basis differences. Define this per destination.

Build glTF-compatible materials#

Use the Principled BSDF path and supported node connections described by Blender's glTF exporter documentation. Complex procedural node graphs do not automatically become portable glTF shaders.

For unsupported procedural effects, bake to images or rebuild in the target. Verify:

  • base color and alpha;
  • metallic and roughness values/channels;
  • normal map node and UV set;
  • occlusion packing;
  • emissive color and strength;
  • alpha mode and cutoff;
  • double-sided behavior;
  • supported material extensions.

Delete unused material slots. Identical-looking materials with separate data blocks can create separate primitives. Canonicalize when no variant or semantic boundary needs them.

Do not bake scene lighting into base color unless the asset's role explicitly needs it.

Optimize images before embedding#

Packing an image into the .blend or GLB does not optimize it. Inventory each image's dimensions, channels, format, color space, and use.

A 4096 × 4096 RGBA8-equivalent decoded image is 64 MiB at its top level. Resize from target texel need. A 2048 map has 75% fewer texels; a 1024 map has 93.75% fewer than 4096.

Use JPEG-like encoding for suitable opaque photographic base color, lossless or GPU-oriented encoding where alpha/data needs it, and KTX2 in a post-export pipeline when the target supports it.

Normal, roughness, metallic, and occlusion are linear data. Base color and emissive are normally sRGB. Do not apply one image rule to every map.

Pack compatible ORM channels only when they share UVs and resolution. Remove alpha that contains no information.

Manage UVs#

Apply a checker at final target density. Inspect island padding, overlap, mirroring, orientation, and unused space.

Every UV seam can split vertices. Thousands of tiny auto-generated islands increase counts and complicate simplification. Reunwrap and rebake when the source layout is pathological.

Preserve unique text and asymmetry. Mirroring a label to save space is not acceptable. Lightmap UVs need non-overlap and adequate padding.

Texture transforms and multiple UV sets need target extension support. Inspect which TEXCOORD accessor each exported material texture references.

Finalize UVs before baking normal maps and atlases. Later repacking breaks correspondence.

Prepare animation and skins#

Export only intended actions or NLA tracks according to a documented preset. Stashed and unnamed actions can enter careless exports.

Set frame range, sample rate, and interpolation based on motion. Reduce redundant keys against pose error; do not simply drop every second key from fast contact animation.

Limit bone influences to target support and normalize weights. Remove non-deforming bones only if sockets, animation, and target logic do not need them.

Test bind pose, extreme poses, root motion, and loop boundaries after export. Apply armature transforms with care; changing bind matrices can destroy animation.

Shape keys become morph targets and multiply vertex attributes. Export only required keys and test their combinations.

Choose exporter settings as a versioned preset#

Record Blender version and exporter options:

  • GLB versus separate glTF;
  • selection/collection scope;
  • custom properties;
  • modifier application;
  • UV, normal, tangent, color, skin, and morph inclusion;
  • material and image settings;
  • animation selection and sampling;
  • compression or post-processing handoff;
  • lighting and camera inclusion.

Do not rely on a screenshot of the export dialog. Use an operator script or checked-in preset configuration for repeatability.

Export to a clean output directory. Stale external images can make a .gltf test pass accidentally.

Post-process outside Blender#

Tools such as glTF Transform and gltfpack can prune, deduplicate, reorder, quantize, compress geometry, and process textures. Run them as a reproducible build after the Blender export.

Change one axis at a time initially. Compare:

  1. raw Blender GLB;
  2. pruned/deduplicated output;
  3. quantized output;
  4. Draco or meshopt candidate;
  5. resized/encoded texture candidate;
  6. combined production candidate.

Record bytes, decode time, memory, runtime counts, and visual error. A smaller codec candidate can decode slower.

Always branch from the same raw export; do not recompress a prior lossy output.

Validate and reopen#

Run Khronos glTF Validator and inspect every warning. Validation checks structure and conformance, not product budgets or target extension support.

Open the GLB in:

  • a neutral glTF reference viewer;
  • the production runtime;
  • a fresh Blender file for round-trip inspection when useful;
  • a component/byte analyzer.

Compare scale, axes, hierarchy, materials, alpha, animation, triangle and vertex counts, bounds, images, and extensions.

Render fixed source and GLB turntables under the same camera and environment. Blender's authored scene may not match the target tone mapping, so use diagnostic passes too.

Batch export safely#

For multiple assets, script:

  • delivery collection selection;
  • object and material allowlists;
  • transform and modifier preflight;
  • counts and bounds;
  • deterministic export options;
  • output naming and hashing;
  • validation and post-processing;
  • reference renders and report;
  • failure without overwriting the last passing artifact.

Run Blender headless with pinned version where practical. Capture console warnings. One malformed asset should fail explicitly rather than cause the batch to export the wrong active collection.

Blender-to-GLB checklist#

Preserve a machine-readable export manifest beside each artifact. Record Blender and exporter versions, delivery collection, selected options, post-process commands, validator result, byte size, and image inventory. When a 4.2 MB release becomes 7.8 MB, that manifest distinguishes an intentional texture change from a silently changed export default.

Add a round-trip smoke test without treating it as an editable-source workflow. Reopen the exported GLB in a fresh Blender file or neutral viewer, then compare counts, bounds, material slots, image inventory, and animation duration. Reimport can legitimately reconstruct nodes differently, so compare delivery behavior rather than demanding an identical authoring graph. This catches missing collection members and external image references before runtime integration.

  • Editable high-detail source remains separate and immutable.
  • Export scope contains only intended delivery objects.
  • Units, axes, transforms, pivots, and bounds match references.
  • Evaluated modifier counts fit the target.
  • Cleanup operations are scale-aware and documented.
  • Simplification uses camera and visual evidence.
  • Triangulation is frozen before baking.
  • Normals, tangents, UVs, and normal maps share final topology.
  • Materials use supported glTF semantics or deliberate bakes.
  • Images have target-driven dimensions, channels, and color spaces.
  • Animation, bones, influences, and morphs are explicitly selected.
  • Raw and post-processed GLBs validate and match the target runtime.

Sources and further reading#

Blender optimization succeeds when the GLB is treated as a generated delivery artifact. Isolate the export collection, freeze geometry and shading inputs in the right order, version the exporter and post-process profile, and approve the reopened file in the runtime that will ship.

Keep learning

Related guides

Platforms10 min

How to Optimize GLB Models for Three.js

Build, load, profile, cache, render, and dispose production GLB assets in Three.js with supported compression and measurable budgets.

Three.jsGLBGLTFLoader
Platforms10 min

How to Optimize 3D Models for Ecommerce Product Viewers

Design measurable 3D product assets and delivery tiers that improve ecommerce inspection without sacrificing page speed, accessibility, visual truth, or conversion analytics.

ecommerce3d product viewerweb performance
Platforms10 min

How to Optimize 3D Models in React Three Fiber

Optimize model loading, rendering, state, memory, frameloops, and responsive quality in React Three Fiber without turning React updates into frame-time work.

React Three FiberThree.jsReact