AccountTry Pro free

OBJ vs STL: what each stores and which one to use

STL is a bare triangle list that every slicer reads; OBJ adds materials, textures and quads, which matters for modelling and scanning but rarely for an FDM print.

Updated 27 October 2026 · 7 min read

What the two files actually contain

STL stores one thing: triangles. A binary STL has an 80-byte header, a 4-byte count and 50 bytes per triangle (a normal and three corners as 32-bit floats, plus two unused bytes). There is no vertex sharing, no colour, no object names and no units. A 1,000,000-triangle STL is always about 50 MB, regardless of the shape.

OBJ (Wavefront) is a text format from the late 1980s that still underpins most modelling pipelines. It lists vertices once (v lines), optionally texture coordinates (vt) and normals (vn), then faces (f) as indices into those lists. Faces can be triangles, quads or larger polygons. The file can be split into named objects (o) and groups (g), and each group can reference a material defined in a companion .mtl file. The MTL file holds diffuse and specular colours, transparency and paths to texture images.

So an OBJ "model" is often three or more files: the .obj, the .mtl and one or more PNG or JPG textures. Lose the MTL and the mesh still loads, just grey. Lose the textures and the surfaces show as flat colour or magenta, depending on the program.

Side-by-side comparison

PropertySTLOBJ
GeometryTriangles onlyTriangles, quads, n-gons
Vertex storageRepeated per triangleShared, indexed
ColourNone in the standardPer-vertex colour (unofficial extension) and per-material colour via MTL
TexturesNoYes, through UV coordinates and MTL
NormalsOne per face, usually recomputedOptional per-vertex normals for smooth shading
Multiple objectsEffectively oneNamed objects and groups
UnitsNoneNone
EncodingBinary or ASCIIASCII only
Typical size, 1 M triangles50 MB binary, 250 MB ASCII60 to 90 MB
Slicer supportUniversalCura, PrusaSlicer, Bambu Studio, Chitubox, Lychee

Where OBJ wins

Modelling and animation

Quads matter when a model will be edited again. Subdivision surfaces, edge loops and sculpting tools in Blender, ZBrush and Maya all work on quad topology. Triangulating a quad mesh on export to STL throws that structure away; the resulting file can be printed but is painful to edit. If you are sending a model to someone who will modify it, send OBJ (or FBX, GLB or the native file), not STL.

Textured scans and colour prints

Photogrammetry tools (RealityCapture, Meshroom, Polycam) export OBJ with a texture atlas by default. Full-colour printing on a Stratasys J-series or Mimaki 3DUJ, and most online full-colour services, accept OBJ plus textures or a ZIP of them. STL cannot carry this at all. Some vendors abuse the two attribute bytes in STL for colour (the Materialise Magics and VisCAM conventions), but almost nothing reads it reliably.

Smooth shading

Per-vertex normals in OBJ let a 20,000-triangle model look smooth in a viewer. STL has only face normals, so the same mesh looks faceted until the viewer recomputes smoothing. This changes nothing about the print, since the slicer only sees the triangles, but it matters for renders and product pages.

Where STL wins

Compatibility

Every slicer, print service, CAM package and mesh tool reads STL. Some older machine firmware, Form 1 era PreForm versions and many online quote forms accept nothing else. If you are not sure what the other end runs, STL is the safe choice.

Simplicity and robustness

There is no companion file to forget and no path inside the file that can break. An OBJ exported on Windows may reference C:\Users\name\textures\wood.jpg in its MTL; on another machine that path is dead. STL has nothing to break in that way.

Smaller, faster parsing

Binary STL is a fixed-stride array, so a loader can read a 100 MB file in well under a second. OBJ is text with index lookups and has to be parsed line by line. For meshes above a few million triangles the difference is noticeable in slicers and viewers.

Units: both formats are unitless

Neither OBJ nor STL stores a unit. Slicers assume millimetres for both. Blender's default scene unit is metres with unit scale 1.0, so a 20 mm cube modelled at 0.02 m exports as 0.02 in either format and arrives in Cura as a speck. The fix is the same for both: set the export scale (Blender OBJ exporter: Scale field, STL exporter: Scale or Scene Unit checkbox) or model directly in millimetre-sized numbers. If a file has already arrived too small or too large, the scale tool resizes it by factor or to a target dimension, and the STL viewer shows the bounding box so you can check before slicing.

Converting between them

OBJ to STL

Conversion triangulates every face (a quad becomes two triangles, an n-gon is fan- or ear-triangulated), merges all groups into one mesh, and drops materials, textures and UVs. In Blender: File > Export > STL, tick Selection Only if the scene has helpers in it. In MeshLab: File > Export Mesh As, pick STL, untick colour options because they produce non-standard output. The OBJ to STL converter does the same in the browser without a desktop install and writes binary STL.

Two things to check afterwards. First, n-gons that were concave or non-planar can triangulate badly and create overlapping or inverted triangles; run the result through mesh repair if the slicer flags errors. Second, if the OBJ had several objects that touch or overlap, they are now one STL with internal faces, which slicers handle inconsistently. Export each object separately if they need to be printed as separate parts, or use the STL splitter to separate disconnected shells afterwards.

STL to OBJ

Going this way gains nothing in detail; it only rewraps the triangles with a shared vertex list. The file becomes slightly smaller than binary STL in some cases and much smaller than ASCII STL. Use it when a tool insists on OBJ (older sculpting apps, some game engines, texturing software like Substance Painter). The STL to OBJ converter welds duplicate vertices during conversion, which also makes the mesh editable as a connected surface instead of triangle soup. No MTL is produced because there is no material to describe.

Print settings are not in either file

Neither format carries layer height, supports, orientation or plate position. If you want a file that remembers all of that, use 3MF, which every current slicer saves as its project format. The STL vs 3MF guide covers what 3MF adds. OBJ is sometimes described as "richer" than STL, and it is, but the richness is for rendering, not printing.

Practical recommendations

  • Sending a part to a print service or slicing it yourself: STL (or 3MF). Nothing in OBJ helps and the extra files only cause questions.
  • Full-colour print: OBJ with MTL and textures zipped together, or 3MF with textures if the service accepts it. Confirm with the vendor first; a few prefer VRML (.wrl).
  • Handing a model to a 3D artist: OBJ, FBX or the native file. Keep quads, keep UVs.
  • Archiving a scan: keep the OBJ and textures as the master, export STL for printing as needed. You can always derive STL from OBJ; the reverse loses the colour forever.
  • Sharing on Printables or Thingiverse: STL or 3MF. Many uploaders accept OBJ but the preview and downloads work better with STL.
  • Game or web use: neither. Convert to GLB, which is compact, binary and carries materials; see the STL to GLB converter.

Checking a file before you commit

Open the file in a viewer and confirm three things: the bounding box in millimetres is what you expect, the triangle count is reasonable for the job (50,000 to 500,000 for most FDM parts), and the mesh is closed. The OBJ viewer shows materials and textures if the MTL and images are dropped in alongside the OBJ; the STL viewer reports dimensions, triangle count and whether the mesh is watertight. If the OBJ has many groups, check whether they are meant to be separate parts; a slicer will treat the merged STL as one object.

FAQ

Is OBJ better than STL for 3D printing?

Not for ordinary single-material printing. The slicer discards everything OBJ adds and triangulates the faces anyway. OBJ is only better when colour or texture must reach the printer, or when the file will be edited again.

Why does my OBJ load without colours?

The colours live in the .mtl file and the textures in separate images. All of them need to be in the same folder as the .obj, and the paths inside the MTL must be relative. Open the MTL in a text editor and look at the map_Kd lines if something is missing.

Can I convert OBJ to STL without losing detail?

Yes. The surface geometry is preserved exactly; only quads are split into triangles and colours are dropped. The vertex coordinates do not change.

Which is smaller, OBJ or STL?

Binary STL is usually smaller than OBJ for the same triangle count because it stores floats compactly, even though it repeats vertices. ASCII STL is the largest of the three by a wide margin.

Do OBJ files have units?

No. Like STL, OBJ stores bare numbers. Most slicers read them as millimetres, most game engines as metres. Check the bounding box after import and scale if needed.