OpenGL 3: glBindVertexArray делает недействительным GL_ELEMENT_ARRAY_BUFFER

Я был уверен, что если вы привязываете буфер через glBindBuffer(), вы можете с уверенностью предположить, что он остается связанным, пока цель не будет восстановлена ​​через другой вызов . ] glBindBuffer(). Поэтому я был очень удивлен, когда обнаружил, что вызов glBindVertexArray()устанавливает буфер, связанный с целью GL_ELEMENT_ARRAY, в 0.

Вот минимальный пример кода C++:

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

Я запускаю этот код сразу после инициализации контекст устройства OpenGL 3.2 и получить следующий вывод:

 Buffer is 1
 Bound before glBindVertexArray: 1
 Bound after glBindVertexArray: 0

GL_ARRAY_BUFFER, с другой стороны, неизменен вызовом. Я проверил спецификацию OpenGL 3.2 (2.10) для glBindVertexArrayи не нашел упоминания об этом неожиданном побочном эффекте.

  1. Соответствует ли такое поведение спецификации?
  2. Если да, то какие другие побочные эффекты можно ожидать от вызова glBindVertexArray?
  3. В чем причина этого?

Я протестировал это на карте nvidia на компьютере с Win XPx64 с драйвером 296.10 WHQL. Быстрый тест на OS X Lion с nvidia GT330M дал те же результаты.

7
задан Nicol Bolas 7 April 2012 в 15:54
поделиться