OpenGL 3: glBindVertexArray invalida GL_ELEMENT_ARRAY_BUFFER

Estaba seguro de que si unes un búfer a través deglBindBuffer(), puede asumir de forma segura que permanece enlazado, hasta que el objetivo se recupere a través de otra llamada aglBindBuffer(). Por eso me sorprendió bastante cuando descubrí esa llamada.glBindVertexArray() establece el búfer enlazado al objetivo GL_ELEMENT_ARRAY a 0.

Aquí está el código de ejemplo de C ++ mínimo:

<code>GLuint buff;
glGenBuffers(1, &buff);
std::cout << "Buffer is " << buff << "\n";
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buff);
GLuint vao;
glGenVertexArrays(1, &vao);

GLint bound_buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound before glBindVertexArray: " << bound_buff << "\n";

glBindVertexArray(vao);    
  // ^- an implicit glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); ?

glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &bound_buff);
std::cout << "Bound after glBindVertexArray: " << bound_buff << "\n";
</code>

Ejecuto este código inmediatamente después de inicializar un contexto de dispositivo OpenGL 3.2 y obtengo el siguiente resultado:

<code> Buffer is 1
 Bound before glBindVertexArray: 1
 Bound after glBindVertexArray: 0
</code>

El GL_ARRAY_BUFFER por otro lado esno cambiado por la llamada. Revisé la especificación de OpenGL 3.2 (2.10) paraglBindVertexArray y no encontró ninguna mención de ese efecto secundario inesperado.

¿Es este comportamiento compatible con la especificación?Si es así, ¿qué otros efectos secundarios se pueden esperar de una llamada aglBindVertexArray?¿Cuál es la razón detrás de esto?

Probé esto en una tarjeta nvidia en una máquina Win XPx64 con el controlador WHQL 296.10. Una prueba rápida en OS X Lion con un nvidia GT330M dio los mismos resultados.

Respuestas a la pregunta(1)

Su respuesta a la pregunta