require the user to call bind; uniforms take strings rather than gluint locations