J'utilise actuellement les classes GLTools qui accompagnent la 5ème édition de Superbible. Je suis à la recherche dans la classe GLTriangleBatch et il a le code suivant:Objet tampon OpenGL Vertex, puis-je accéder aux données de vertex pour d'autres utilisations telles que la détection de collision?
// 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;
D'après ce que je comprends le code passe les tableaux que les pointeurs pVerts, pNorms, pTexCoords, pIndexes et les stocke dans un objet tableau Vertex, qui est essentiellement un tableau d'objets de tampon vertex. Ceux-ci sont stockés en mémoire sur le GPU. Les pointeurs d'origine sont ensuite supprimés.
Je suis intéressé par l'accès aux positions de vertex, qui ont été maintenues dans le tableau pVert pointé vers. Maintenant, ma question tourne autour de la détection de collision. Je veux être en mesure d'accéder à un tableau de tous les sommets de mon GLTriangleBatch. Puis-je les obtenir via le vertexBufferObject
à un moment ultérieur en utilisant une sorte de méthode getter? Serait-il préférable de garder le pointeur pVerts et d'utiliser une méthode getter à la place? Je pense en termes de performance, car j'espère implémenter un algorithme de détection de collision GJK à l'avenir ...
Merci beaucoup! Cette réponse a été très utile! Je vais garder le pointeur pVert pour accéder aux données de vertex plus tard. – kbirk
@ user785259: Garder juste le pointeur n'est pas suffisant. Vous devez en fait conserver la mémoire allouée, c'est-à-dire ne pas supprimer delete() ou free (...). Même après avoir libéré de la mémoire, vous pouvez toujours avoir le pointeur sur C, qui n'est alors pas valide. Peut-être que vous venez d'un langage collecté par les ordures, alors rejeter un pointeur implique en fait de libérer de la mémoire, et oui, c'est la sémantique saine. Mais c'est le C++ auquel vous avez affaire et tout ce tapage est une nécessité incontournable là-bas. – datenwolf