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.

Entspricht dieses Verhalten der Spezifikation?Wenn ja, welche anderen Nebenwirkungen sind bei einem Anruf zu erwarten?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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage