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.
glBindVertexArray
?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.