glTF Max Skinning Joints Per Vertex Explained

The glTF 2.0 format handles skeletal animation through joint and weight vertex attributes, allowing models to deform realistically across complex skeletons. While the specification defines joint influences in sets of four, the architecture natively supports an arbitrary number of attribute sets, meaning there is no hard-coded theoretical maximum defined by the file format itself. This article breaks down how glTF structures vertex skinning attributes, how joint limits function natively, and the practical rendering constraints associated with these limits.

Attribute Structure: The Rule of Four

In glTF, vertex skinning influences are stored in parallel mesh primitive attributes labeled JOINTS_n and WEIGHTS_n, where n represents the index set starting from 0 (e.g., JOINTS_0, WEIGHTS_0).

Every joint and weight attribute is strictly defined as a VEC4 data type:

  • JOINTS_n: Holds four joint indices referencing the skeleton nodes.
  • WEIGHTS_n: Holds four floating-point or normalized scalar values representing the influence of each corresponding joint.

Because every set consists of a four-component vector, vertex skinning is always allocated in multiples of four.

Native glTF Limits

From a strict specification standpoint, glTF does not define a maximum ceiling for the value of n. A mesh primitive can contain:

  • JOINTS_0 and WEIGHTS_0 (Joints 1–4)
  • JOINTS_1 and WEIGHTS_1 (Joints 5–8)
  • JOINTS_2 and WEIGHTS_2 (Joints 9–12)
  • JOINTS_n and WEIGHTS_n (Joints \(4n + 1\) through \(4n + 4\))

Consequently, the native maximum number of joints per vertex in glTF is theoretically unlimited. As long as each additional set follows the standard naming convention and supplies normalized weights across all sets summing to 1.0, the glTF schema considers the file valid.

Conformance and Real-World Limitations

Although the specification permits unlimited sets, runtime environments impose practical restrictions based on hardware and shader capabilities:

  • Baseline Conformance: The glTF 2.0 specification requires conforming client implementations to support at least one set (JOINTS_0 and WEIGHTS_0), guaranteeing support for a minimum of 4 joints per vertex.
  • Common Engine Support: Major WebGL and real-time engines (such as Three.js, Babylon.js, Unity, and Unreal Engine) typically support either 4 or 8 joints per vertex (one or two sets) out of the box. Exceeding 8 joints per vertex often causes client engines to truncate influences, drop additional sets, or require custom shader pipelines to handle the excessive vertex attribute overhead.