Compose a root-to-leaf chain of attribute records.
The chain is ordered from the outermost ancestor (root) to the leaf node
whose effective attributes we want. Unset values are treated as identity:
opacity/gamma/intensity = 1, offset = 0. A set blending_mode at any
level overrides the cumulative choice; a set winning string is validated
through normalizeBlendingMode (unknown string → 'normal' + one-time
warning), so every consumer sees a canonical mode. An unset chain yields
undefined — each consumer then applies its own per-type default (spec
§6.3: additive for points/lines/gsplats, opaque for mesh).
Compose a root-to-leaf chain of attribute records.
The chain is ordered from the outermost ancestor (root) to the leaf node whose effective attributes we want. Unset values are treated as identity: opacity/gamma/intensity = 1, offset = 0. A set
blending_modeat any level overrides the cumulative choice; a set winning string is validated throughnormalizeBlendingMode(unknown string → 'normal' + one-time warning), so every consumer sees a canonical mode. An unset chain yieldsundefined— each consumer then applies its own per-type default (spec §6.3:additivefor points/lines/gsplats,opaquefor mesh).