Skip to main content

glTF Extension Support

Fromv9.3

This page summarizes the glTF extensions that @luma.gl/gltf handles in its default loader-to-scenegraph path. Each extension name links to its official Khronos-managed specification page in the glTF extension registry repository.

Status meanings:

  • : works end-to-end in the default luma.gl glTF pipeline.
  • ✅ *️⃣: works in the default pipeline, with low-level decoding handled by @loaders.gl/gltf during load.
  • 🚧: work in progress for this release; implemented paths are still under active validation.
  • *️⃣: extension data is preserved or exposed, but applications still need to decide how to use it at runtime.
  • App: applications are responsible for selecting and applying the feature.
  • : no built-in handling today.
ExtensionSupportNotes
✅ *️⃣

@loaders.gl/gltf decompresses Draco meshes and converts them to regular glTF meshes.

✅ *️⃣

Meshopt-compressed primitives are decoded during load and converted to regular glTF meshes.

✅ *️⃣

Quantized accessors are unpacked during load before geometry creation.

GPU instancing data is not yet converted into luma.gl instanced draw setup.

Punctual lights are parsed and exposed as an array of luma.gl lighting module lights.

Unlit materials bypass the default lighting calculations.

✅ 🚧

Emissive strength now multiplies the emissive contribution in the stock PBR shader.

✅ 🚧

The stock shader now applies specular intensity and color factors and textures to the dielectric F0 term.

✅ 🚧

The stock shader now drives dielectric reflectance from the glTF IOR value.

✅ 🚧

The stock shader now applies transmission to the base layer and exposes transparency through alpha, without a scene-color refraction buffer.

Diffuse-transmission shading is not implemented in the stock PBR shader.

✅ 🚧

Thickness factor plus attenuation color and distance now tint transmitted light in the stock shader.

Chromatic dispersion is not implemented in the stock PBR shader.

Volume scattering is not implemented in the stock PBR shader.

✅ 🚧

The stock shader now adds a secondary clearcoat lobe from the clearcoat and clearcoat-roughness inputs.

✅ 🚧

The stock shader now adds a sheen lobe using the sheen color and roughness inputs.

✅ 🚧

The stock shader now tints specular response with a view-dependent thin-film iridescence approximation driven by the extension inputs.

✅ 🚧

The stock shader now shapes highlights and IBL response with an anisotropy-direction approximation.

*️⃣

loaders.gl can preserve the extension data, but @luma.gl/gltf does not translate it into the default metallic-roughness shader path.

App

Variant metadata can be loaded, but applications must choose and apply variants themselves.

✅ *️⃣

BasisU / KTX2 textures are passed through as compressed textures when supported by the device.

✅ *️⃣

@loaders.gl/gltf resolves the texture source; runtime support still depends on browser and device decode support.

✅ *️⃣

Same as WebP: the source is resolved during load, with final support depending on decode support.

loaders.gl rewrites the core material UV sets during load before luma.gl creates geometry.

✅ 🚧

Node TRS pointers, selected material factor pointers, and animated KHR_texture_transform offset/rotation/scale pointers are wired to runtime updates. Still unsupported: morph weights, cameras, extras, structural material switches such as alphaMode / doubleSided / unlit, animated KHR_texture_transform.texCoord, and texture slots that resolve to TEXCOORD_2+. When used with KHR_materials_transmission / KHR_materials_volume, luma.gl still uses its stock transmission approximation, so effects such as heat-haze-style scene refraction will not yet match the Khronos Sample Viewer.

Node-visibility animations and toggles are not mapped onto runtime scenegraph state.

Metadata payloads remain in the loaded glTF, but luma.gl does not interpret them.

Metadata is available in the loaded glTF, but luma.gl does not interpret it.

Use loadPBREnvironment() or custom environment setup instead of relying on automatic extension handling. The current Khronos sample-asset catalog does not include an official EXT_lights_image_based sample.

Video textures are not created automatically by the glTF pipeline.

Level-of-detail switching is not implemented in the stock scenegraph loader.

Notes

  • The built-in material extension rows are implemented in the stock pbrMaterial shader. Some of the more advanced effects, such as transmission, iridescence, and anisotropy, use pragmatic approximations because the default pipeline does not maintain a scene-color refraction buffer or a more specialized anisotropic BRDF.
  • Some extensions have partial field coverage. For example, luma.gl currently wires the main textures and factors for several KHR_materials_* extensions, but does not yet implement every auxiliary texture path in the stock shader.
  • @luma.gl/gltf relies on @loaders.gl/gltf for low-level extension decoding, decompression, and glTF post-processing.