Actualmente estoy usando las clases GLTools que vienen con la 5ª edición de Superbible. Busco en la clase GLTriangleBatch y tiene el siguiente código:Objeto de búfer OpenGL Vertex, ¿puedo acceder a los datos de vértice para otros usos, como la detección de colisión?
// 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;
Por lo que entiendo el código pasa a las matrices que los punteros pVerts, pNorms, pTexCoords, pIndexes y los almacena en una tabla de objeto Vertex, que esencialmente es una matriz de objetos de búfer de vértice. Estos se almacenan en la memoria en la GPU. Los punteros originales se eliminan.
Estoy interesado en acceder a las posiciones de los vértices, que se mantuvieron en la matriz apuntada pVert.
Ahora mi pregunta gira en torno a la detección de colisiones. Quiero poder acceder a una matriz de todos los vértices de mi GLTriangleBatch. ¿Puedo obtenerlos a través del vertexBufferObject
más adelante utilizando algún tipo de método getter? ¿Sería mejor mantener el puntero pVerts y usar un método getter para eso? Estoy pensando en términos de rendimiento, como espero para implementar un algoritmo de detección de colisiones GJK en el futuro ...
¡Gracias! ¡Esa respuesta fue muy útil! Mantendré el puntero pVert para acceder a los datos de vértice más tarde. – kbirk
@ user785259: Mantener solo el puntero no es suficiente. De hecho, debe mantener la memoria asignada, es decir, no 'eliminar []' o 'libre (...)'. Incluso después de liberar memoria, puede tener el puntero en C, que luego no es válido. Tal vez vienes de un lenguaje basura, luego descartar un puntero implica en realidad liberar memoria, y sí, esta es la semántica cuerda. Pero esto es C++ con el que estás lidiando y todo esto es una necesidad ineludible. – datenwolf