¿Qué estado de objeto modifica glEnableVertexAttribArray?

Creo que entiendo lo que hace glEnableVertexAttribArray: activa un atributo particular de un programa (corríjame si me equivoco).

Sin embargo, lo que no entiendo es qué objeto almacena esta información. ¿Es el objeto del programa? Es decir, si lo hago:

glUseProgram(program);
glEnableVertexAttribArray(0);

y luego hacer:

glUseProgram(program);
glDrawArray(...);

¿se habilitará el atributo en la ubicación 0?

¿O está modificando algún estado global que debe restablecerse cada vez antes de cada llamada de sorteo? ¿O está modificando el estado de la VAO? Si es así, ¿qué pasa con OpenGL ES 2.0, donde no hay VAO?

Respuestas a la pregunta(1)

Su respuesta a la pregunta