The most bones one skinned draw may use — the declared §62 capability behind
RendererCapabilities.maximumSkinningJoints (RFC 0003 §5).
48, a portability floor rather than a device query, and the arithmetic
is the reason: the palette is uniform mat4 jointMatrices[N] in the vertex
stage, WebGL 2 guarantees only MAX_VERTEX_UNIFORM_VECTORS ≥ 256 vec4s, a
mat4 is four of them, and the skinned programs' other uniforms (two
matrices, colours, §68's light set) need headroom — 48 × 4 = 192 vec4s
leaves 64 for everything else on the worst conformant device. A constant
rather than a getParameter read, deliberately: R-30b's recorded law binds
(a capability query must be lazy if the alternative moves recorded
transcripts), and a per-device limit is a negotiation the fixed-palette
tier does not need — the unbounded path is a bone texture, deferred
with its reasons in RFC 0003 (it needs the render-target format union
widened and vertex texture fetch checked per device).
A Skeleton over more bones is refused at setup — Mesh.skeleton
throws UNSUPPORTED_GPU_FEATURE (§89) on assignment — following R-5/R-6's
setup-time validation stance (§61: a backend may not throw from inside a
frame). Splitting into per-palette submeshes and a CPU fallback are the
named, not-taken alternatives (RFC 0003 open question 5, adopted).
The most bones one skinned draw may use — the declared §62 capability behind
RendererCapabilities.maximumSkinningJoints(RFC 0003 §5).48, a portability floor rather than a device query, and the arithmetic is the reason: the palette is
uniform mat4 jointMatrices[N]in the vertex stage, WebGL 2 guarantees onlyMAX_VERTEX_UNIFORM_VECTORS ≥ 256vec4s, a mat4 is four of them, and the skinned programs' other uniforms (two matrices, colours, §68's light set) need headroom —48 × 4 = 192vec4s leaves 64 for everything else on the worst conformant device. A constant rather than agetParameterread, deliberately: R-30b's recorded law binds (a capability query must be lazy if the alternative moves recorded transcripts), and a per-device limit is a negotiation the fixed-palette tier does not need — the unbounded path is a bone texture, deferred with its reasons in RFC 0003 (it needs the render-target format union widened and vertex texture fetch checked per device).A
Skeletonover more bones is refused at setup — Mesh.skeleton throwsUNSUPPORTED_GPU_FEATURE(§89) on assignment — following R-5/R-6's setup-time validation stance (§61: a backend may not throw from inside a frame). Splitting into per-palette submeshes and a CPU fallback are the named, not-taken alternatives (RFC 0003 open question 5, adopted).