setUniformAt (name, index, value) {
    const attrs = this.geometry.attributes
    const attrName = `troika_attr_${name}`
    let attr = attrs[attrName]
    if (!attr) {
      const defaultValue = getDefaultUniformValue(this._baseMaterial, name)
      const itemSize = getItemSizeForValue(defaultValue)
      attr = attrs[attrName] = new InstancedBufferAttribute(new Float32Array(itemSize * this._maxCount), itemSize)
      // Fill with default value:
      if (defaultValue !== null) {
        for (let i = 0; i < this._maxCount; i++) {
          setAttributeValue(attr, i, defaultValue)
        }
      }
      this._instancedUniformNames = [...this._instancedUniformNames, name]
    }
    setAttributeValue(attr, index, value)
    attr.needsUpdate = true
  }
Set the value of a shader uniform for a single instance.
@param {string} name - the name of the shader uniform
@param {number} index - the index of the instance to set the value for
@param {number|Vector2|Vector3|Vector4|Color|Array|Matrix3|Matrix4|Quaternion} value - the uniform value for this instance