если мои данные вершин были выложены
пример:
struct Vertex
{
float position[4];
float normal[3];
float texCoord[2];
}
я знаю, что мы используем
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_uiVertBufferHandle );
//get the pointer position where we can add verts
void* pPositionBuffer = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );
//now copy into our memory spot
//which we need to move to the right position
memcpy( ((char*)pPositionBuffer) + ( uiVertLocation*sizeof(VertexFormat) ), pVerts, iNumVerts*sizeof(VertexFormat));
//now stop mapping
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
для полной копии это то, как я это делаю, но мне просто нужно отредактировать данные о положении вершин и не изменять какие-либо другие атрибуты
я просто обновляю позиционные данные на стороне процессора для некоторого тестирования
struct Vertex
{
float position[4]; <----
float normal[3];
float texCoord[2];
}
После сопоставления буфера вы можете использовать его память, как и любую другую память в вашей программе. Например, вы можете просто написать этот код:
Vertex *cur_vertex = (Vertex *)pPositionBuffer + uiVertLocation;
for (int i = 0; i < iNumVerts; i++)
cur_vertex[i]->position = pVerts[i]->position;
вместо memcpy
Вы можете переупорядочить данные в вашем буфере, сохранив сначала все вершины, затем все нормали и все координаты текстуры. Тогда просто используйте glMapBufferRange
и отобразить только часть, содержащую вершины, и обновить только эту часть.