в openGL, как мне отредактировать определенный атрибут буфера вершин из памяти

если мои данные вершин были выложены

пример:

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];
}

1

Решение

После сопоставления буфера вы можете использовать его память, как и любую другую память в вашей программе. Например, вы можете просто написать этот код:

Vertex *cur_vertex = (Vertex *)pPositionBuffer + uiVertLocation;
for (int i = 0; i < iNumVerts; i++)
cur_vertex[i]->position = pVerts[i]->position;

вместо memcpy

1

Другие решения

Вы можете переупорядочить данные в вашем буфере, сохранив сначала все вершины, затем все нормали и все координаты текстуры. Тогда просто используйте glMapBufferRange и отобразить только часть, содержащую вершины, и обновить только эту часть.

1