code: func (gs *glShader) setUniform(name string, value interface{}) {
  	t, p := getAttrType(value)
  	if loc := gs.getUniform(name); loc > -1 {
  		gs.uniforms[loc].Name = name
  		gs.uniforms[loc].Type = t
  		gs.uniforms[loc].ispointer = p
  		gs.uniforms[loc].value = value
  		return
  	}
  	gs.uniforms = append(gs.uniforms, gsUniformAttr{
  		Name:      name,
  		Type:      t,
  		ispointer: p,
  		value:     value,
  	})
  }
docs: // SetUniform appends a custom uniform name and value to the shader.
  // if the uniform already exists, it will simply be overwritten.
  //
  // example:
  //
  //   utime := float32(time.Since(starttime)).Seconds())
  //   mycanvas.shader.AddUniform("u_time", &utime)