Come interagisce re-glBufferData () 'ing con glVertexAttribPointer?
Capisco la sequenza di base: glGenBuffers () crea un "nome oggetto buffer", glBindBuffer () crea l'oggetto buffer effettivo (oltre a vincolare il nome), glBufferData () "crea e inizializza l'archivio dati di un oggetto buffer" e glVertexAttribPointer () imposta il formato dei dati del buffer, oltre a salvare l'associazione dell'oggetto buffer come parte dello stato dell'array di attributi del vertice.
La cosa complicata di cui non sono sicuro è se la roba glVertexAttribPointer () rimane valida se il "buffer object data store" (ma non l'oggetto buffer stesso) viene spazzato via da una nuova chiamata a glBufferData (). Sono consapevole che questa di solito non è una buona idea - usa glBufferSubData () quando si riscrivono solo i buffer - ma glBufferData () sembra l'unica opzione se deve essere ridimensionato. Inoltre, sono solo curioso.
Le pagine di riferimento fanno sembrare che potrebbe andare in entrambi i modi, in particolare (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml):
Se il puntatore non è NULL, un oggetto buffer denominato diverso da zero deve essere associato alla destinazione GL_ARRAY_BUFFER (vedere glBindBuffer ), altrimenti viene generato un errore. il puntatore viene considerato come un offset di byte nell'archivio dati dell'oggetto buffer. L'associazione dell'oggetto buffer (GL_ARRAY_BUFFER_BINDING) viene salvata come stato matrice dell'attributo vertice generico (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) per l'indice dell'indice .
Quando viene specificato un array di attributi di vertici generico, dimensione , tipo , normalizzato , andatura e puntatore vengono salvati come stato di array di vertici, oltre al collegamento dell'oggetto buffer di array di vertici corrente.
Sembra che sia l'offset di byte che l'associazione dell'oggetto buffer potrebbero rimanere validi, anche se l'archivio dati è stato sostituito da qualcosa di diverso. Ma potrei anche vederlo implementato in modo tale che al momento della chiamata, l'associazione acquisisca un puntatore specifico nell'archivio dati, che viene invalidato se l'archivio dati viene sostituito. Nessuna delle due modalità sembra essere preclusa dalla formulazione.
Risposte
Sembra che le associazioni glVertexAttribPointer () rimangano valide, anche dopo chiamate successive a glBufferData (). L'ho determinato provandolo, il che non è una prova al 100%: potrebbe funzionare solo con questa implementazione (driver NVidia, nel mio caso).
Tuttavia, con una richiamata del messaggio di errore e la modalità di debug attive, ricevo il seguente messaggio alla seconda chiamata a glBufferData (), che suggerisce fortemente che questa situazione è prevista / progettata per:
[LWJGL] Messaggio di debug OpenGL ID: 0x20071 Fonte: API Tipo: ALTRO Gravità: NOTIFICA Messaggio: informazioni dettagliate sul buffer: oggetto buffer 1 (associato a GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0), GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (1) e GL_ARRAY_BUFFER_ARB, il suggerimento di utilizzo è il buffer di memoria GLWSTATIC.
I primi due collegamenti rappresentano le mie due chiamate a glVertexAttribPointer () e non sono presenti nel messaggio che viene registrato la prima volta che chiamo glBufferData ().