Буферный объект OpenGL Vertex, могу ли я получить доступ к данным вершин для других целей, таких как обнаружение коллизий?

В настоящее время я использую классы GLTools, которые поставляются вместе с 5-м изданием Superbible. Я ищу в классе GLTriangleBatch, и он имеет следующий код:

// 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;

Насколько я понимаю, код передает массивы указателей pVerts, pNorms, pTexCoords, pIndexes и сохраняет их в объекте массива Vertex, который, по сути, является массив объектов буфера вершин. Они хранятся в памяти графического процессора. Затем исходные указатели удаляются.

Меня интересует доступ к позициям вершин, которые содержались в массиве, на который указывает pVert.

Теперь мой вопрос вращается вокруг обнаружения столкновений. Я хочу иметь доступ к массиву всех вершин моего GLTriangleBatch. Могу ли я получить их через vertexBufferObject позже, используя какой-то метод получения? Было бы лучше просто оставить указатель pVerts и вместо этого использовать для этого метод получения? Я думаю о производительности, так как надеюсь реализовать алгоритм обнаружения столкновений GJK в будущем ...

6
задан greatwolf 13 July 2011 в 05:30
поделиться