glTF to GLB Converter
Pack a glTF model into one GLB file right in your browser. Add the .gltf together with its .bin and picture files (pick them together, open the folder, or drop the ZIP they came in), and the converter copies every buffer and every picture into the GLB byte for byte. Nothing is decoded or compressed again, so the geometry, animations, materials, extensions and even compressed meshes stay exactly as they were. Before you download, the GLB is read back and every accessor and picture is compared with the original, and three.js reads both files to check they show the same model. Missing pictures and web addresses are kept as links and named. Drop a .glb instead to get the .gltf + .bin back. Nothing is uploaded.
100% private — everything runs in your browser. Everything runs in your browser; your glTF files are never uploaded.
File details
How the GLB is made
The .bin data and the picture files are copied into the GLB byte for byte. Nothing is decoded, compressed again or resized, and the rest of the .gltf (materials, animations, extensions) is kept as it is.
Runs in your browser: your .gltf, .bin and picture files are read on your device and never uploaded, and web addresses inside the file are not fetched. The 3D engine (three.js) loads from the jsDelivr CDN for the 3D view and the read-back check. You may use what you make here, including commercially, with no credit needed. The rights in your own models stay as they were.
How to convert a glTF to GLB
- Drop the .gltf with its .bin and textures on the box, open the folder, or drop the ZIP; or click Try a sample.
- Check the list of files the .gltf refers to: every one should say found.
- Look at the check line and the 3D view of the GLB as read back.
- Click Download GLB. To go back, drop a .glb and download the .gltf + .bin.
What you can use it for
- Turn a model exported as separate files into one file for a website, AR or a game engine
- Send a model as one attachment instead of a folder
- Pack a model before uploading it somewhere that accepts only GLB
- Keep compressed meshes and custom extensions exactly as they were while packing
- Unpack a GLB to edit its JSON by hand, then pack it again
- Check that a .gltf has all its files before you share it
What goes from the .gltf into the GLB
| In the glTF | In the GLB from this converter |
|---|---|
| .bin files (one or several) | Copied byte for byte into the GLB’s one binary chunk, each on an 8-byte boundary |
| Buffers embedded as data URIs (base64 text) | Decoded once to the original bytes and stored as binary |
| PNG, JPEG, WebP, KTX2 and AVIF pictures (files or data URIs) | Copied byte for byte into new buffer views, with their type set from the bytes |
| Pictures that are missing or web addresses | Kept as links and named in the notes (web addresses are not fetched) |
| Accessors, buffer views, sparse data | Unchanged; buffer views move with their buffer |
| Meshes, materials, nodes, animations, skins, cameras | Unchanged |
| Extensions and extras (Draco, meshopt, KHR_* and custom) | Unchanged, compressed data still compressed |
A GLB is a 12-byte header, the glTF JSON padded with spaces, and one binary chunk padded with zeros, all on 4-byte boundaries, as the glTF 2.0 specification sets out. The page writes exactly that and nothing else.
What our test files give
| Test file | What it checks | Size of the .gltf | GLB | Buffers packed | Pictures packed | Kept as links | Accessors the same | Read back the same |
|---|---|---|---|---|---|---|---|---|
| crate.gltf | Crate: .gltf + .bin + 2 pictures in a sub-folder (one name with a space), interleaved data, 3 extensions | 2.9 KB (.gltf only) | 3.2 KB | 1 | 2 | 0 | 4 of 4 | Yes |
| flag.gltf | Two .bin files, a sparse morph target and an animation | 1.3 KB (.gltf only) | 1.4 KB | 2 | 0 | 0 | 5 of 5 | Yes |
| embedded.gltf | Buffer and pictures embedded as data: addresses | 3.5 KB (.gltf only) | 3.2 KB | 1 | 2 | 0 | 4 of 4 | Yes |
| leaf.gltf | WebP picture (EXT_texture_webp) with a PNG fallback | 1.6 KB (.gltf only) | 5.0 KB | 1 | 2 | 0 | 4 of 4 | Yes |
| links.gltf | One picture missing and one web address (both kept as links) | 1.6 KB (.gltf only) | 2.5 KB | 1 | 0 | 2 | 4 of 4 | Yes |
Computed by the converter’s own packer from our own glTF test files. Each GLB was read back three ways: by our own byte-level check, by three.js, and by the open-source glTF-Transform library, and all three found the same accessors, pictures and extensions as the original .gltf.
Inside the GLB
| Part | Bytes | What it holds |
|---|---|---|
| Header | 12 | “glTF”, version 2 and the total file length |
| JSON chunk header | 8 | Length and the type JSON |
| JSON chunk | the glTF JSON, padded with spaces to a multiple of 4 | Everything from the .gltf, with one buffer and no file names for packed data |
| BIN chunk header | 8 | Length and the type BIN |
| BIN chunk | the data, padded with zeros to a multiple of 4 | Every .bin in order (8-byte aligned), then every packed picture (4-byte aligned) |
Layout from the glTF 2.0 specification’s GLB file format section. Our crate test file: 3,244 bytes as a GLB.
GLB to glTF
| Drop | You get |
|---|---|
| model.glb | model-gltf.zip with model.gltf (readable JSON) and model.bin |
| Pictures inside the GLB | Kept inside model.bin, so no index changes |
| Read back | Packing the two files again gives the same JSON and the same bytes |
Next steps
Turn the GLB into a print file with GLB to STL and check it in the STL viewer. Tidy the .gltf JSON with the JSON Formatter, or shrink big textures first with the Image Compressor.
Sources
Sources: Khronos Group: glTF 2.0 Specification, GLB file format (header, JSON and BIN chunks, 4-byte padding); glTF 2.0 Specification: URIs (relative paths, data URIs).
More free tools
Working with 3D models?
View, convert and make 3D files with free tools that run privately in your browser, with no sign-up and no watermark.
Frequently asked questions
Is this glTF to GLB converter free?
Yes. There is no sign-up, no watermark and no limit on how many models you pack. Everything runs in your browser, so your files never leave your device.
Is anything lost when packing?
No. A GLB is the same glTF in one binary file, so the converter copies the .bin data and the picture files in unchanged and keeps the rest of the JSON as it is. The only changes are the ones the GLB format needs: the buffers become one, and pictures get a buffer view and a type instead of a file name. The page checks this byte by byte before you download.
What files do I need to add?
The .gltf and every file it names: usually one .bin and some PNG or JPEG pictures. The page lists each file the .gltf refers to as found, missing or embedded. Picking the whole folder or dropping the ZIP is easiest, because the files keep their folder paths.
What if a texture is missing?
The GLB is still made, and the missing picture is kept as a link to its file name, so it can be added later; the page names it. A missing .bin stops the conversion, because the geometry is in it.
Are extensions kept?
Yes, all of them, including ones this page does not know, because nothing in the JSON is rewritten except buffers and picture links. Draco or meshopt compressed meshes, texture transforms, KTX2 or WebP pictures and custom extras stay as they were.
Will the GLB be smaller?
About the same size as the .gltf and its files together, because the data is copied as it is. A .gltf with embedded data stores it as base64 text, about a third larger than binary, so that kind gets smaller. The geometry and pictures are not compressed further; to make the file smaller, compress the textures or meshes in a 3D app first.
Can I turn a GLB back into glTF?
Yes. Drop the .glb and download a ZIP with the .gltf and its .bin. The pictures stay inside the .bin, as in the GLB, and packing the two files again gives the same data.
Does it work with glTF 1.0?
No. GLB here is glTF 2.0, the version almost every app exports today. Open an old glTF 1.0 file in an app that exports glTF 2.0 first.
Why are there two .bin files in my model?
Some exporters write one .bin per mesh or animation. A GLB holds one buffer, so the converter joins them in order (each on an 8-byte boundary) and moves every buffer view with it; the page says if a buffer name was dropped.
Are my glTF files uploaded?
No. The .gltf, .bin and picture files are read and packed by JavaScript in your browser, so they never leave your device, and web addresses inside the file are not fetched. Only the 3D engine itself (three.js) is loaded from a public CDN, for the 3D view and the check. There is no sign-up and no watermark.