OpenGL 3: glBindVertexArray macht GL_ELEMENT_ARRAY_BUFFER ungültig
Ich war mir sicher, wenn Sie einen Puffer über bindenglBindBuffer()
können Sie davon ausgehen, dass es gebunden bleibt, bis das Ziel durch einen weiteren Aufruf von zurückgebunden wirdglBindBuffer()
. Ich war deshalb ziemlich überrascht, als ich diese Berufung entdeckteglBindVertexArray()
Setzt den an das GL_ELEMENT_ARRAY-Ziel gebundenen Puffer auf 0.
Hier ist der minimale C ++ - Beispielcode:
<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>
Ich führe diesen Code sofort nach dem Initialisieren eines OpenGL 3.2-Gerätekontexts aus und erhalte die folgende Ausgabe:
<code> Buffer is 1 Bound before glBindVertexArray: 1 Bound after glBindVertexArray: 0 </code>
Der GL_ARRAY_BUFFER ist dagegennicht durch den Anruf geändert. Ich habe die OpenGL 3.2-Spezifikation (2.10) auf überprüftglBindVertexArray
und fand keine Erwähnung dieser unerwarteten Nebenwirkung.
glBindVertexArray
?Was ist das Grundprinzip dahinter?Ich habe dies auf einer NVIDIA-Karte auf einem Win XPx64-Computer mit dem 296.10 WHQL-Treiber getestet. Ein schneller Test unter OS X Lion mit einem nvidia GT330M ergab die gleichen Ergebnisse.