2014-02-02 6 views
1

, если мои данные вершин был заложен изв 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]; 
} 
+0

Вы, вероятно, следует использовать 'GL_WRITE_ONLY' в этом случае, так как вы не хотите, чтобы прочитать значения, вы просто хотите отправить GL - новый. Тем не менее, если вы часто это делаете, вы, вероятно, также захотите использовать 'glMapBufferRange (...)' и недействительность, чтобы сообщить GL, что он может отказаться от старой памяти, чтобы минимизировать накладные расходы синхронизации. Поскольку вы используете *** буферные объекты ARB ***, у меня есть ощущение, что это не вариант (явное недопустимое значение диапазона буфера довольно новое). –

ответ

1

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

1

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

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

вместо memcpy

+0

я понимаю это часть. Я просто хочу, чтобы мне нужно было отобразить его обратно. вы говорите, что я могу просто взять данные назад и просто обработать его, как их формат, и заполнить эти пробелы. вот и все? просто прекратите отображение, и все должно быть хорошо? –

+0

Когда вы вызываете glUnmapBufferARB, каждое сделанное вами изменение будет перенесено обратно на устройство, вам не нужно ни о чем заботиться. –

+0

Я сделаю снимок. Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^