Convert GLB to glTF

Converting GLB to glTF here gives you a single self-contained JSON file with the geometry embedded as a base64 buffer, which is what you want when you need to read a model rather than render it. Be clear about the trade first: this rebuilds the document from its triangles, so the materials, textures and animation inside the GLB do not come out the other side.

  • Where it runs In your browser. The file is never uploaded.
  • Rebuilt GLTF works differently from a GLB, so this is not the gradual degradation a lossy codec applies. What GLTF can express is reproduced faithfully; what it has no equivalent for does not survive at all.
  • File size limit Up to 100 MB per file, free, without an account.
  • Worth knowing Geometry only. Materials, colours, textures and animation are not carried across, and a model placed several times comes back with each copy baked into its own position.

Up to 100 files at once. Mixed formats are fine.

What this GLB to glTF conversion actually does

It reads the geometry out of the GLB and writes a new glTF around it. That is a rebuild, not a repack. The tools that repack — gltf-pipeline with --binary=false, or gltf-transform — keep the original document intact and only move the buffer out of the binary container, which means the material definitions, the texture references and the animation channels all survive verbatim.

Here they do not. The converter walks the scene graph, pulls out vertex positions and triangle indices, and builds a fresh document with one mesh per primitive and one node per mesh. If your reason for converting is "I want to edit the baseColorFactor and save it back", this is the wrong tool and gltf-transform is the right one. If your reason is "I want to see what is in this file", read on.

Why a GLB and a glTF are the same format wearing different clothes

Both are glTF 2.0, the Khronos Group specification published in June 2017 with the binary container in it from the start. A .gltf is JSON, with the vertex data either in a .bin file next to it or embedded as a data URI. A .glb is the same JSON with the same buffer, concatenated into one binary file behind a twelve-byte header whose first four bytes spell glTF.

Inside a GLB the content sits in chunks: a JSON chunk tagged JSON and a binary chunk tagged BIN, each padded out to a four-byte boundary with the padding counted in the declared length, which is why every chunk length in a valid GLB is a multiple of four. That is the entire difference between the two extensions. Nothing about the model changes when you move between them — which is precisely why a converter that rebuilds the model, as this one does, is doing more than the extension change implies.

The glTF file you get back, and how its buffer is stored

One file, always. The vertex data is base64-encoded into a data URI on the single buffer entry, so there is no .bin sidecar to lose and no relative path to break when you move the file. A conversion produces one download, and splitting the output into two files would make that untrue.

Base64 costs four characters for every three bytes, so the embedded buffer is about 33 percent larger than the binary it encodes, and the JSON around it is pretty-printed with two-space indentation on top of that. For a file you are going to open in an editor that is a fair trade. For a file you are going to serve to a browser it is not, and the GLB you already have is the better artefact.

Everything a GLB holds that this glTF will not

The list is long and it is worth reading in full: PBR metallic-roughness materials, base colour, normal, occlusion, emissive and metallic-roughness textures, samplers and images, UV coordinates, vertex normals, vertex colours, tangents, morph targets, skins and joints, animation samplers and channels, cameras, lights, and every extension the file declares.

What survives is vertex positions, triangle indices and mesh names. The scene hierarchy survives only in the sense that its effect does — see the next section. This is not a limitation of the glTF format, which holds all of the above comfortably; it is a limitation of this converter, which carries geometry between six formats that agree on almost nothing else.

Node transforms are baked when a GLB becomes glTF here

A glTF scene routinely places one mesh several times with different matrices — four wheels referencing one wheel mesh is the standard example. The converter walks the scene graph from the default scene, multiplies each node matrix by its parent, and applies the resulting world matrix to the vertices before writing them out.

The consequence is that the shape you see is correct and the structure is not. Four wheels arrive as four meshes with four sets of vertices in four different places, rather than one mesh instanced four times. Node rotation, translation and scale given as separate TRS properties are composed into a matrix first, in the quaternion order glTF defines, so a model built that way lands in the same place as one built with an explicit matrix.

GLB files this converter will refuse, and what the message means

Draco-compressed geometry stops with a named error rather than a broken file. KHR_draco_mesh_compression stores vertex data in a compressed stream that needs its own decoder, and that decoder is not shipped here. Re-export from Blender or run gltf-transform with Draco disabled and the file reads normally.

Primitives that are not triangle lists are skipped silently rather than mangled. glTF mode 4 is triangles; modes 0 through 3 are points, lines, line loops and line strips, and modes 5 and 6 are triangle strips and fans. A GLB containing only line geometry — a wireframe overlay, a debug path — produces the message that no triangle geometry was found, which is accurate.

Reading the result: what the glTF JSON tells you about the GLB

Open the output and the accessors array answers most of the questions people convert a GLB to ask. Each mesh contributes a VEC3 float accessor for positions and a SCALAR unsigned-int accessor for indices; divide the index count by three for the triangle count, and read the vertex count straight off the position accessor.

The POSITION accessor also carries min and max, which the specification requires and which viewers use to frame the model. Those six numbers are the bounding box, and they are the fastest way to find out that a model somebody sent you is a thousand times too large or sitting nowhere near the origin. Mesh names come through from the source, so a multi-part model stays legible.

When not to convert your GLB to glTF at all

If the file is going onto a web page, keep the GLB. It is smaller, it is one request, and three.js, Babylon.js and model-viewer all load it directly. Converting to glTF for delivery makes the file larger and, through this converter, strips the materials that made it worth showing.

If you need to change something and save it back, use gltf-transform or the Blender glTF exporter. If you need to inspect a file quickly without installing anything, or you need a text artefact to diff against another export, this page is the short route. Being explicit about that boundary is more useful than a page that implies every GLB should become a glTF.

Size limits and where a GLB is processed here

The conversion is plain JavaScript running in the page — no WebAssembly module to download, no upload, no queue. The file is read with FileReader-style APIs and the result is assembled into a Blob you then save. The free ceiling is 100 MB, which is a very large GLB by the standards of anything meant for the web.

Because the output embeds its buffer as base64 inside pretty-printed JSON, expect the .gltf to be larger than the .glb it came from even after the materials have been dropped — the geometry is the bulk of most models, and base64 inflates it. A 12 MB GLB whose geometry accounts for 9 MB of that lands around 12 MB again as glTF, with none of the textures.

How to convert GLB to GLTF

  1. Drop your GLB onto this page, or click to choose one.
  2. The geometry is read and rewritten as glTF in your browser.
  3. Download the .gltf and open it in any editor.

GLB against glTF: one specification, two containers

GLB compared with GLTF
GLBGLTF
Full nameBinary glTFGL Transmission Format
File extension.glb.gltf
Media typemodel/gltf-binarymodel/gltf+json
First published20162015
Published byKhronos GroupKhronos Group
SpecificationglTF 2.0glTF 2.0
LicensingOpen standardOpen standard
Standing todayCurrentCurrent
Opens in a browserNo browserNo browser
Considered insteadOBJOBJ

What survives

Animation survives. GLB and GLTF both hold multiple frames, so the result moves rather than freezing on the first one.

Opening the result

Blender, three.js and Babylon.js read both GLB and GLTF, so there is a way to check the result against the original without a second tool.

What each format is for

GLB is Khronos Group's format, published in 2016. The specification is glTF 2.0, and it is worth reading if the file has to outlive the tool that wrote it.

GLTF comes from Khronos Group and dates from 2015, specified as glTF 2.0. Blender, three.js and Babylon.js all read it.

GLB to glTF: what people ask before they run it

Are my GLB files uploaded anywhere?

No. This conversion runs entirely inside your browser, so the file never leaves your device. You can confirm it yourself: open the network tab of your browser's developer tools and convert something. You will see the page load, plus the analytics and advertising the site is paid for with — and nothing carrying your file.

Is this the same as unpacking a GLB?

No, and the difference matters. A proper unpack keeps the same document and only changes the container. This rebuilds the file from its geometry, so the glTF you get back has fresh accessors, one node per mesh, and none of the materials, textures or animation the GLB carried.

Do I get a separate .bin file alongside the glTF?

No. The buffer is embedded as a base64 data URI inside the JSON, so the download is a single self-contained .gltf. That is roughly a third larger than the same bytes stored binary, which is the cost of having one file instead of two.

Will the materials come across?

No. PBR material definitions, base colour textures, normal maps, UV coordinates and vertex colours are all dropped. What survives is vertex positions, triangle indices and the mesh names.

What about animations and skinned meshes?

Neither survives. Animation channels, samplers, skins and joint hierarchies are not read, and a rigged character comes back as the static geometry of its bind pose.

Why does my GLB fail with a message about Draco?

Because the file declares KHR_draco_mesh_compression, and the Draco decoder is not shipped here. Re-export the model without Draco compression and it reads normally.

Can I read the triangle count out of the result?

Yes. Each mesh gets one primitive with a SCALAR index accessor; its count divided by three is the triangle count, and the POSITION accessor carries min and max, which gives you the bounding box in the same glance.

More about these formats