Cookies for analytics and advertising
We use cookies for analytics and advertising, both sent to Google. Refusing changes nothing you can see.Read the privacy page
Converting glTF to GLB collapses a JSON model into one binary file, which is what upload forms, CDNs and viewers such as model-viewer prefer. One condition decides whether it works here: the glTF must carry its geometry inside itself as a base64 buffer. A glTF that points at a separate .bin file has nothing this converter can read.
Up to 100 files at once. Mixed formats are fine.
They convert one after another and download together as a ZIP.
GLTF to GLB
There are two kinds of .gltf in the world and only one of them works here. Open the file in a text editor and look for the "buffers" array near the end. If the entry has a uri that starts with data:application/octet-stream;base64, every vertex in the model is inside that one file and the conversion will run. If the uri reads scene.bin or model.bin, the geometry lives in a second file that a single-file converter never sees.
That second shape is the more common one, because it is what most exporters produce by default, and it is why this page opens with the check rather than burying it in an FAQ. Dropping a separate-buffer glTF here produces an explicit message telling you the geometry is elsewhere and suggesting the .glb version instead — which is a real suggestion, since whatever produced the .gltf can almost always produce a .glb directly.
A glTF with external resources is a small graph of files held together by relative paths: the JSON, a .bin, and one image per texture. Every one of those paths is a way for the model to break. Move the JSON without its neighbours and it loads as nothing; serve it from a CDN with a different directory layout and the buffer 404s; attach it to a message and only one of the four files goes.
A GLB has none of those failure modes because there is nothing to lose. It is also one HTTP request instead of several, which matters on a page where the model is the thing the visitor came for. That single-file property is the entire reason the binary container is in glTF 2.0 in the first place, specified alongside the JSON form rather than bolted on later.
The output is a glTF 2.0 binary: a twelve-byte header whose magic spells glTF followed by a version number and the total length, then a JSON chunk, then a binary chunk. The JSON chunk is padded to a four-byte boundary with spaces and the binary chunk with zero bytes, which the specification requires rather than merely tolerates — several loaders reject a file padded the other way round.
Inside, vertex positions are written as float32 in a VEC3 accessor and triangle indices as uint32 in a SCALAR accessor, without exception. Narrower index types would save a few kilobytes on small models and would need a conditional that silently changes behaviour at 65,535 vertices, which is a bad trade for a converter. Every position accessor carries the min and max the specification asks for, so viewers frame the model instead of opening zoomed to nothing.
This converter moves geometry. A glTF that declares a metallic-roughness material with a base colour texture, a normal map and an emissive map converts to a GLB containing vertex positions, triangle indices and mesh names — and the material block, the images, the samplers and the texture coordinates are simply not written.
That is worth weighing against the reason you are converting. If the point was to bundle textures into one shippable file, this page does not do it and gltf-transform or the Blender exporter does. If the point was to get a single binary artefact out of a self-contained JSON — for a size test, a geometry-only preview, a placeholder in a scene — the result is exactly right and considerably smaller.
Animation channels and samplers are not read, skins and joint hierarchies are not read, and cameras and lights are not read. A rigged and animated character arrives in the GLB as the static geometry of whatever pose the vertex data describes, with no way to move it.
For a static prop, a piece of architecture, a scanned object or a printed part this costs nothing, because there was nothing to lose. For a character or a mechanism it is the whole model. There is no partial outcome here and no setting that changes it, so the honest guidance is to check what your glTF contains before converting rather than after.
The source scene is walked from its default scene index, and each node matrix is composed with its parent before the vertices are transformed by the result. Nodes described with separate translation, rotation and scale properties are converted to a matrix first, using the quaternion form glTF defines, so both authoring styles land in the same place.
The GLB that comes out has a flat structure: one scene, one node per mesh, no parenting, no reuse. A model whose glTF placed a single bolt mesh forty times through the hierarchy becomes forty meshes with forty copies of the vertices. The picture is identical and the file is larger, which is the trade every format without instancing forces.
Draco-compressed geometry stops with a message naming Draco. KHR_draco_mesh_compression replaces the plain buffer views with a compressed stream, and decoding it needs a library that is not shipped here. Re-exporting without Draco is a checkbox in Blender and a flag in gltf-transform.
Geometry stored as triangle strips, fans, lines or points is skipped rather than converted, because only glTF mode 4 is a triangle list. A file that contains nothing else ends with a message that no triangle geometry was found. A malformed JSON file — a truncated download is the usual cause — is reported as unreadable rather than parsed into something arbitrary.
An embedded glTF stores its buffer as base64, which costs four characters for every three bytes. Moving the same geometry into a GLB binary chunk removes that overhead, so a self-contained glTF usually shrinks by roughly a quarter on conversion before anything else is counted.
Then subtract everything the converter does not carry. For a model whose bulk was textures, the GLB can be a small fraction of the original and correspondingly bare. A useful sanity check after converting is the triangle count: the index accessor count divided by three should match what your source tool reported, and if it does not, the source contained geometry in a form that was skipped.
Nowhere. This pair runs as plain JavaScript in the page, with no WebAssembly module to fetch and no request carrying the model. The parse, the transform bake and the binary assembly all happen on your machine, which is why there is no queue and no per-file wait.
The free ceiling is 100 MB, and a self-contained glTF is the one format here likely to approach it, since base64 makes it the most inflated way to store the same mesh. If you are near that line, the model is almost certainly better served by exporting GLB directly from the tool that made it.
| GLTF | GLB | |
|---|---|---|
| Full name | GL Transmission Format | Binary glTF |
| File extension | .gltf | .glb |
| Media type | model/gltf+json | model/gltf-binary |
| First published | 2015 | 2016 |
| Published by | Khronos Group | Khronos Group |
| Specification | glTF 2.0 | glTF 2.0 |
| Licensing | Open standard | Open standard |
| Standing today | Current | Current |
| Opens in a browser | No browser | No browser |
| Considered instead | OBJ | OBJ |
Animation survives. GLTF and GLB both hold multiple frames, so the result moves rather than freezing on the first one.
Blender, three.js and Babylon.js read both GLTF and GLB, so there is a way to check the result against the original without a second tool.
GLTF is Khronos Group's format, published in 2015. The specification is glTF 2.0, and it is worth reading if the file has to outlive the tool that wrote it.
GLB comes from Khronos Group and dates from 2016, specified as glTF 2.0. Blender, three.js and Babylon.js all read it.
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.
No. The converter takes one file, and a glTF that keeps its geometry in a separate .bin has nothing to read. You get a message saying so rather than an empty model. Re-export the model with buffers embedded, or export GLB directly from whatever produced it.
Open it in a text editor and find the "buffers" array. If the uri begins with "data:application/octet-stream;base64," the geometry is inside the file and it will convert. If it names something like scene.bin, it will not.
No. Textures, materials and UV coordinates are not carried across at all, so the GLB contains geometry and mesh names and nothing else. Packing textures into a binary container is what gltf-transform and the Blender exporter do; this converter does not.
Usually yes, for an embedded glTF, because base64 costs a third more than the bytes it encodes and the GLB stores those bytes raw. The saving disappears against a glTF that kept its buffer in a separate .bin, which was never inflated in the first place.
Yes — it is a valid glTF 2.0 binary with an asset version, a default scene, one node per mesh and min/max bounds on every position accessor, which is what viewers use to frame a model. It will render as untextured geometry, because that is all it contains.