Vertex attribute slot the optional joint-index stream is bound to (§53,
§54; RFC 0003, 2026-08-28) — fixed by layout(location = 4) in the skinned
vertex stages (gl-skinning.ts), continuing R-19's numbering, and a public
layout commitment: @fourjs/geometry's BufferGeometry.joints documents it,
and glTF's second influence set (JOINTS_1/WEIGHTS_1) is the named
extension point at locations 8 / 9, past the first morph pair
(spec revision 1.19).
The stream is uploaded as non-normalized UNSIGNED_SHORT floats
(vertexAttribPointer, not vertexAttribIPointer): the shader declares
in vec4 joints and indexes with int(...), which is exact for every
index a Uint16Array can carry and keeps this package's GL surface — and
every recorded double — free of an integer-attribute entry point. A program
that does not declare the slot ignores it, as with every optional stream.
Vertex attribute slot the optional joint-index stream is bound to (§53, §54; RFC 0003, 2026-08-28) — fixed by
layout(location = 4)in the skinned vertex stages (gl-skinning.ts), continuing R-19's numbering, and a public layout commitment:@fourjs/geometry'sBufferGeometry.jointsdocuments it, and glTF's second influence set (JOINTS_1/WEIGHTS_1) is the named extension point at locations 8 / 9, past the first morph pair (spec revision 1.19).The stream is uploaded as non-normalized
UNSIGNED_SHORTfloats (vertexAttribPointer, notvertexAttribIPointer): the shader declaresin vec4 jointsand indexes withint(...), which is exact for every index aUint16Arraycan carry and keeps this package's GL surface — and every recorded double — free of an integer-attribute entry point. A program that does not declare the slot ignores it, as with every optional stream.