Я был уверен, что если вы привязываете буфер через 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
и не нашел упоминания об этом неожиданном побочном эффекте.
glBindVertexArray
?Я протестировал это на карте nvidia на компьютере с Win XPx64 с драйвером 296.10 WHQL. Быстрый тест на OS X Lion с nvidia GT330M дал те же результаты.