POLYMASON

OBJ, FBX, GLB or STL: which format, and when

Part of The OBJ file format, explained for game engines

Every model you download or export will be in one of four formats, and each one exists for a reason. This is what they carry, what they lose, and which engine wants which. It is the comparison from the OBJ guide; the import steps for whichever you end up with are in the Unity, Godot and Unreal articles.

The table

OBJFBXGLB (glTF)STL
kindtextbinarybinary, open specbinary or text
geometryyesyesyestriangles only
normalsoptionalyesyesper face
texture coordinatesyesyesyesno
materialsin a second file (MTL)embeddedembedded, PBRno
texturesby file nameembedded or by nameembeddedno
vertex coloursnon-standardyesyesno
hierarchyflat, named objectsfull scene treefull scene treenone
rig and animationnoyesyesno
unitsnone statedstatedmetresnone
up axisnone statedstatedYnone
Unitynativenativevia glTFast packageno
Godot 4nativenative from 4.3native, preferredno
Unrealnativenativenativeno
printersrarelynonoyes, and 3MF
readable by a personyesnonotext form, yes

OBJ

The oldest and the simplest. A text file of vertices and faces with a companion .mtl for materials. It carries no unit and no up axis, so every importer assumes something; it carries no rig, no animation and no scene hierarchy. What it has is universality: everything reads it, it is easy to generate and to inspect, and for a static prop it holds everything that matters.

Use it for static environment pieces and props, for anything you might want to read or repair in a text editor, and for the widest possible compatibility. The OBJ guide is the full anatomy.

FBX

Autodesk's format, and the one Unity and Unreal pipelines assume. Binary, so compact and unreadable; it holds meshes, materials, textures embedded or referenced, the whole scene hierarchy, skeletons, skinning, animation clips, blend shapes and cameras. Every engine reads it through Autodesk's library, which is why support is universal and why nothing outside Autodesk writes it perfectly.

Its well-known trap is scale: Blender's FBX exporter and Unity's importer disagree about centimetres and metres, which is the origin of models arriving a hundred times too big or too small. Godot 4.3 and later read FBX with its own importer, ufbx; earlier versions needed a conversion to glTF.

Use it for characters, for anything rigged or animated, and when a Unity or Unreal project has a pipeline built on it.

GLB and glTF

glTF is the open format from the Khronos Group, the people behind OpenGL and Vulkan; GLB is its single-file binary form. It holds what FBX holds, meshes, hierarchy, PBR materials with textures embedded, skeletons and animation, in a specification anyone can read, with units fixed at metres and Y up so there is nothing to assume. It is the web's format and Godot's preferred one; Unreal imports it natively; Unity needs the glTFast package, which is a one-line install from the package manager.

Use it for almost anything once you have it, and ask for it first from a pack that offers a choice. Its one gap is that older tools and some marketplaces still do not write it well.

STL

Triangles and nothing else: no colour, no material, no texture coordinates, no unit, and a normal per face that most readers ignore. It is the format 3D printers and slicers want, and no engine reads it. 3MF is its modern replacement, with colours and units, and slicers read both.

Use it for printing, and for nothing else.

Which to ask a pack for

For a game: GLB if offered, FBX if not, and OBJ if it is what there is; OBJ is never wrong for a static prop. For a printer: STL or 3MF. If a pack offers OBJ and FBX only and the model is static, the OBJ is the safer file, because there is nothing in it to go wrong.

What PolyMason writes

The tree builder writes OBJ with its material library and a palette texture, STL for printing, and 3MF with the colours in it. GLB is next, for Godot and the web; FBX after that, for Unreal.

More in this guide

  • The OBJ file format, explained for game enginesEverything in an OBJ file and its MTL, everything it leaves out (units, axes, colours), how it compares with FBX, GLB and STL, and how Unity, Godot and Unreal each import one without the model arriving tiny, sideways or grey.
  • How to import an OBJ into Unity, at the right size, in colour, shaded flatStep by step: getting an OBJ and its materials into Unity, the Scale Factor and Convert Units settings that make a model the right size, what to do when a model arrives a hundred times too big, the Materials tab, normals for flat shading, and colliders.
  • How to import an OBJ into Godot 4, as a mesh or a sceneStep by step: putting an OBJ and its MTL into a Godot 4 project, the difference between importing it as a mesh and as a scene, scale, materials, reimporting after a change, generating LODs, and adding collision.
  • How to import an OBJ into Unreal Engine, at the right scaleStep by step: importing an OBJ as a Static Mesh in Unreal Engine 5, the Import Uniform Scale of 100 that a file in metres needs, Convert Scene for the up axis, Normal Import Method for flat shading, what happens to the MTL's materials, collision, LODs and Nanite.

Or build a tree and see what comes out.