Attualmente sto usando i corsi GLTools che accompagnano la 5a edizione di Superbible. Sto cercando nella classe GLTriangleBatch e ha il seguente codice:Oggetto buffer OpenGL Vertex, posso accedere ai dati del vertice per altri usi come il rilevamento delle collisioni?
// Create the master vertex array object
glGenVertexArrays(1, &vertexArrayBufferObject);
glBindVertexArray(vertexArrayBufferObject);
// Create the buffer objects
glGenBuffers(4, bufferObjects);
#define VERTEX_DATA 0
#define NORMAL_DATA 1
#define TEXTURE_DATA 2
#define INDEX_DATA 3
// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_VERTEX);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pVerts, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_NORMAL);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_TEXTURE0);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_TEXTURE0, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Indexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*nNumIndexes, pIndexes, GL_STATIC_DRAW);
// Done
glBindVertexArray(0);
// Free older, larger arrays
delete [] pIndexes;
delete [] pVerts;
delete [] pNorms;
delete [] pTexCoords;
// Reasign pointers so they are marked as unused
pIndexes = NULL;
pVerts = NULL;
pNorms = NULL;
pTexCoords = NULL;
Da quello che ho capito il codice passa le matrici che i puntatori pVerts, pNorms, pTexCoords, pIndexes e li memorizza in un oggetto array Vertex, che essenzialmente è una matrice di oggetti buffer vertici. Questi sono memorizzati in memoria sulla GPU. I puntatori originali vengono quindi eliminati.
Sono interessato ad accedere alle posizioni dei vertici, che sono state mantenute nell'array pVert indicato.
Ora la mia domanda ruota attorno al rilevamento delle collisioni. Voglio poter accedere a un array di tutti i vertici del mio GLTriangleBatch. Posso ottenerli attraverso lo vertexBufferObject
in un secondo momento usando una sorta di metodo getter? Sarebbe meglio mantenere semplicemente il puntatore pVerts e utilizzare invece un metodo getter per questo? Sto pensando in termini di prestazioni, in quanto spero di implementare un algoritmo di rilevamento collisione GJK in futuro ...
Grazie! Questa risposta è stata molto utile! Terrò il puntatore pVert in giro per accedere ai dati del vertice in seguito. – kbirk
@ user785259: mantenere il puntatore non è sufficiente. In realtà devi mantenere la memoria allocata, cioè non 'delete []' o 'free (...)' it. Anche dopo aver rilasciato la memoria potresti avere ancora il puntatore in C, che quindi non è valido. Forse stai venendo da un linguaggio spazzato, quindi scartare un puntatore implica in realtà liberare memoria, e sì, questa è la semantica sana. Ma questo è il C++ con cui hai a che fare e tutto ciò è una necessità inevitabile lì. – datenwolf