OpenGL 3: glBindVertexArray unieważnia GL_ELEMENT_ARRAY_BUFFER

Byłem pewien, że jeśli połączysz bufor przezglBindBuffer(), możesz bezpiecznie założyć, że pozostaje związany, dopóki cel nie zostanie odbity przez kolejne wywołanieglBindBuffer(). Byłem więc zaskoczony, gdy odkryłem to powołanieglBindVertexArray() ustawia bufor związany z celem GL_ELEMENT_ARRAY na 0.

Oto minimalny przykładowy kod C ++:

<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>

Uruchomię ten kod natychmiast po zainicjowaniu kontekstu urządzenia OpenGL 3.2 i otrzymam następujące dane wyjściowe:

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

Z drugiej strony GL_ARRAY_BUFFERnie zmienione przez połączenie. Sprawdziłem specyfikację OpenGL 3.2 (2.10) dlaglBindVertexArray i nie znalazł wzmianki o tym nieoczekiwanym skutku ubocznym.

Czy to zachowanie jest zgodne ze specyfikacją?Jeśli tak, jakich innych skutków ubocznych można się spodziewać po wywołaniuglBindVertexArray?Jakie jest tego uzasadnienie?

Przetestowałem to na karcie nvidia na komputerze Win XPx64 ze sterownikiem 296.10 WHQL. Szybki test na OS X Lion z NVIDIA GT330M dał takie same wyniki.

questionAnswers(1)

yourAnswerToTheQuestion