OpenGL 3: glBindVertexArray invalida GL_ELEMENT_ARRAY_BUFFER

Eu estava certo de que se você ligar um buffer viaglBindBuffer(), você pode seguramente assumir que ele permanece vinculado, até que o destino seja recuperado por meio de outra chamada paraglBindBuffer(). Fiquei, portanto, bastante surpreso quando descobri que chamarglBindVertexArray() define o limite do buffer para o destino GL_ELEMENT_ARRAY como 0.

Aqui está o código de exemplo mínimo do 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>

Eu corro este código imediatamente após inicializar um contexto de dispositivo OpenGL 3.2 e obter a seguinte saída:

<code> Buffer is 1
 Bound before glBindVertexArray: 1
 Bound after glBindVertexArray: 0
</code>

O GL_ARRAY_BUFFER, por outro lado, énão alterado pela chamada. Eu verifiquei a especificação do OpenGL 3.2 (2.10) paraglBindVertexArray e não encontrou menção a esse efeito colateral inesperado.

Este comportamento é compatível com o Spec?Em caso afirmativo, que outros efeitos colaterais podem ser esperados de uma chamada paraglBindVertexArray?Qual é a lógica por trás disso?

Eu testei isso em uma placa nvidia em uma máquina Win XPx64 com o driver 296.10 WHQL. Um teste rápido no OS X Lion com um nvidia GT330M deu os mesmos resultados.

questionAnswers(1)

yourAnswerToTheQuestion