Skip to content
Header only C++11 tiny glTF 2.0 library
C++ C Python CMake Makefile Lua
Branch: master
Clone or download
syoyo Merge pull request #240 from kacprzak/master
Set target for bufferView used by MorphTargets
Latest commit 5735693 Jan 22, 2020
Type Name Latest commit message Commit time
Failed to load latest commit information.
cmake Renamed glTFConfig to TinyGLTFConfig Dec 26, 2018
deps Apply cpplint. Apr 20, 2016
examples Use const reference for Buffer to fix compilation. Sep 4, 2019
experimental Correctly handle filename containing spaces for external resources. F… Jun 4, 2018
models Possible fix for error: invalid path 'models/CubeImageUriSpaces/ 2x2 … Jan 17, 2020
tests Add clang fuzzer tester. Jan 18, 2020
tools/windows Update premake5.exe binary(5.0.0 alpha12). Dec 9, 2017
.clang-format Refactor source code. Mar 7, 2016
.gitignore Set up tests to run in travis-ci and ignore test outputs in .gitignore Apr 25, 2019 Setup CI for raytrace example Feb 22, 2018
.travis.yml Fix travis script. Oct 30, 2019
CMakeLists.txt Introduce TINYGLTF_BUILD_EXAMPLES option to CMakeLists.txt. Fixes #218 Oct 30, 2019
LICENSE Add name of Adrien and many contributrors. Dec 31, 2017
Makefile Add build option with draco in Makefile. Mar 8, 2019 Add clang fuzzer tester. Jan 18, 2020
appveyor.yml Setup CI for raytrace example Feb 22, 2018
examples.bat Setup CI for raytrace example Feb 22, 2018
json.hpp Update json.hpp to fix compilation with clang with C++17(-std=c++1z) … Feb 4, 2019 Add feature to store original JSON string for extras and extensions(f… Oct 30, 2019
premake5.lua Rename premake config script. Dec 8, 2017
stb_image.h Upgrade the STB libraries, and fix #132 Mar 2, 2019
stb_image_write.h Revert "Support simultaneous gltf load/saves" Sep 4, 2019 Add build option with draco in Makefile. Mar 8, 2019
tiny_gltf.h Set target for bufferView used by MorphTargets Jan 22, 2020
vcsetup.bat Change VS version to one that is better compatible with C++11 Jan 10, 2018

Header only C++ tiny glTF library(loader/saver).

TinyGLTF is a header only C++11 glTF 2.0 library.

TinyGLTF uses Niels Lohmann's json library(, so now it requires C++11 compiler. If you are looking for old, C++03 version, please use devel-picojson branch.


  • v2.4.0 Experimental RapidJSON support. Experimental C++14 support(C++14 may give better performance)
  • v2.3.0 Modified Material representation according to glTF 2.0 schema(and introduced TextureInfo class)
  • v2.2.0 release(Support loading 16bit PNG. Sparse accessor support)
  • v2.1.0 release(Draco support)
  • v2.0.0 release(22 Aug, 2018)!


Build Status

Build status


  • Written in portable C++. C++-11 with STL dependency only.
    • macOS + clang(LLVM)
    • iOS + clang
    • Linux + gcc/clang
    • Windows + MinGW
    • Windows + Visual Studio 2015 Update 3 or later.
      • Visual Studio 2013 is not supported since they have limited C++11 support and failed to compile json.hpp.
    • Android NDK
    • Android + CrystaX(NDK drop-in replacement) GCC
    • Web using Emscripten(LLVM)
  • Moderate parsing time and memory consumption.
  • glTF specification v2.0.0
    • ASCII glTF
      • Load
      • Save
    • Binary glTF(GLB)
      • Load
      • Save(.bin embedded .glb)
  • Buffers
    • Parse BASE64 encoded embedded buffer data(DataURI).
    • Load .bin file.
  • Image(Using stb_image)
    • Parse BASE64 encoded embedded image data(DataURI).
    • Load external image file.
    • Load PNG(8bit and 16bit)
    • Load JPEG(8bit only)
    • Load BMP
    • Load GIF
    • Custom Image decoder callback(e.g. for decoding OpenEXR image)
  • Morph traget
    • Sparse accessor
  • Load glTF from memory
  • Custom callback handler
    • Image load
    • Image save
  • Extensions
    • Draco mesh decoding
    • Draco mesh encoding

Note on extension property

In extension(ExtensionMap), JSON number value is parsed as int or float(number) and stored as tinygltf::Value object. If you want a floating point value from tinygltf::Value, use GetNumberAsDouble() method.

IsNumber() returns true if the underlying value is an int value or a floating point value.


  • glview : Simple glTF geometry viewer.
  • validator : Simple glTF validator with JSON schema.
  • basic : Basic glTF viewer with texturing support.

Projects using TinyGLTF


  • Write C++ code generator which emits C++ code from JSON schema for robust parsing.
  • Mesh Compression/decompression(Open3DGC, etc)
    • Load Draco compressed mesh
    • Save Draco compressed mesh
    • Open3DGC?
  • Support extensions and extras property
  • HDR image?
    • OpenEXR extension through TinyEXR.
  • 16bit PNG support in Serialization
  • Write example and tests for animation and skin


TinyGLTF is licensed under MIT license.

TinyGLTF uses the following third party libraries.

  • json.hpp : Copyright (c) 2013-2017 Niels Lohmann. MIT license.
  • base64 : Copyright (C) 2004-2008 René Nyffenegger
  • stb_image.h : v2.08 - public domain image loader - Github link
  • stb_image_write.h : v1.09 - public domain image writer - Github link

Build and example

Copy stb_image.h, stb_image_write.h, json.hpp and tiny_gltf.h to your project.

Loading glTF 2.0 model

// Define these only in *one* .cc file.
// #define TINYGLTF_NOEXCEPTION // optional. disable exception handling.
#include "tiny_gltf.h"

using namespace tinygltf;

Model model;
TinyGLTF loader;
std::string err;
std::string warn;

bool ret = loader.LoadASCIIFromFile(&model, &err, &warn, argv[1]);
//bool ret = loader.LoadBinaryFromFile(&model, &err, &warn, argv[1]); // for binary glTF(.glb)

if (!warn.empty()) {
  printf("Warn: %s\n", warn.c_str());

if (!err.empty()) {
  printf("Err: %s\n", err.c_str());

if (!ret) {
  printf("Failed to parse glTF\n");
  return -1;

Compile options

  • TINYGLTF_NOEXCEPTION : Disable C++ exception in JSON parsing. You can use -fno-exceptions or by defining the symbol JSON_NOEXCEPTION and TINYGLTF_NOEXCEPTION to fully remove C++ exception codes when compiling TinyGLTF.
  • TINYGLTF_NO_STB_IMAGE : Do not load images with stb_image. Instead use TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data) to set a callback for loading images.
  • TINYGLTF_NO_STB_IMAGE_WRITE : Do not write images with stb_image_write. Instead use TinyGLTF::SetImageWriter(WriteimageDataFunction WriteImageData, void *user_data) to set a callback for writing images.
  • TINYGLTF_NO_EXTERNAL_IMAGE : Do not try to load external image file. This option would be helpful if you do not want to load image files during glTF parsing.
  • TINYGLTF_ANDROID_LOAD_FROM_ASSETS: Load all files from packaged app assets instead of the regular file system. Note: You must pass a valid asset manager from your android app to tinygltf::asset_manager beforehand.
  • TINYGLTF_ENABLE_DRACO: Enable Draco compression. User must provide include path and link correspnding libraries in your project file.
  • TINYGLTF_NO_INCLUDE_JSON : Disable including json.hpp from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_NO_INCLUDE_STB_IMAGE : Disable including stb_image.h from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE : Disable including stb_image_write.h from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_USE_RAPIDJSON : Use RapidJSON as a JSON parser/serializer. RapidJSON files are not included in TinyGLTF repo. Please set an include path to RapidJSON if you enable this featrure.
  • TINYGLTF_USE_CPP14 : Use C++14 feature(requires C++14 compiler). This may give better performance than C++11.

Saving gltTF 2.0 model

  • Buffers.
    • To file
    • Embedded
    • Draco compressed?
  • Images
    • To file
    • Embedded
  • Binary(.glb)
    • .bin embedded single .glb
    • External .bin

Running tests.

glTF parsing test


Python 2.6 or 2.7 required. Git clone to your local dir.

Run parsing test

After building loader_example, edit, then,

$ python

Unit tests

$ cd tests
$ make
$ ./tester
$ ./tester_noexcept

Fuzzing tests

See tests/fuzzer for details.

Third party licenses

  • json.hpp : Licensed under the MIT License Copyright (c) 2013-2017 Niels Lohmann
  • stb_image : Public domain.
  • catch : Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. Distributed under the Boost Software License, Version 1.0.
  • RapidJSON : Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
You can’t perform that action at this time.