Ero sicuro che se si associa un buffer tramite glBindBuffer()
, è possibile presumere che rimanga vincolato, fino a quando il target non viene rebound tramite un'altra chiamata a glBindBuffer()
. Quindi sono rimasto molto sorpreso quando ho scoperto che chiamare glBindVertexArray()
imposta il buffer legata al bersaglio GL_ELEMENT_ARRAY a 0.OpenGL 3: glBindVertexArray invalida GL_ELEMENT_ARRAY_BUFFER
Ecco il codice C minimo ++ di esempio:
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";
ho eseguito questo codice subito dopo l'inizializzazione di un OpenGL 3.2 contesto di dispositivo e ottenere il seguente output:
Buffer is 1
Bound before glBindVertexArray: 1
Bound after glBindVertexArray: 0
la GL_ARRAY_BUFFER invece è non modificati dalla chiamata. Ho controllato la specifica OpenGL 3.2 (2.10) per glBindVertexArray
e non ho trovato alcun riferimento a quell'effetto collaterale inaspettato.
- Questo comportamento è conforme alla specifica?
- In tal caso, quali altri effetti collaterali ci si possono aspettare da una chiamata a
glBindVertexArray
? - Qual è la logica alla base di questo?
L'ho provato su una scheda nvidia su una macchina Win XPx64 con il driver WHQL 296.10. Un test rapido su OS X Lion con una nvidia GT330M ha dato gli stessi risultati.
Penso che l'associazione di un VAO vincoli implicitamente i buffer di elementi e di vertici. Ecco a cosa servono i VAO. Se si associa un VAO e si associa un indice e un buffer di vertici, tali buffer vengono quindi associati in modo implicito ogni volta che si associa il VAO in un secondo momento. Quindi legare il VAO sopra ha presumibilmente implicitamente impostato l'array di elementi e vertici a zero in quanto questi non sono stati inclusi da te nell'oggetto VAO. Aveva senso? :-) – Robinson
Ma perché cambia solo GL_ELEMENT_ARRAY_BUFFER e non GL_ARRAY_BUFFER? – ComicSansMS
Poiché il buffer di matrice è il buffer di vertici (almeno i vari glEnableVertexAttribArray e glVertexAttribPointer chiamano make con esso) e include un buffer di elementi come parte di quello stato. – Robinson