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.
glBindVertexArray
?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.