копирование между чередующимися объектами буфера вершин openGL - PullRequest
1 голос
/ 15 февраля 2011

с использованием opengl 3.3, radeon 3870HD, c ++ ..

У меня вопрос о чередующихся массивах данных. Я попал в структуру приложения в векторе, который отправляется как данные в буферный объект. Примерно так:

struct data{
  int a;
  int b;
  int c;
};

std::vector<data> datVec;
...
glBufferData(GL_ARRAY_BUFFER, sizeof(data)*datVec.size(), &datVec[0], GL_DYNAMIC_DRAW);

это нормально, я использую эту вещь очень часто. Но я создаю чередующийся массив, поэтому данные выглядят так:

a1,b1,c1,a2,b2,c2,a3,b3,c3

Теперь я отправляю эту вещь для обработки в GPU и с обратной связью преобразования преобразую обратно в буфер, например, для переменных b. Так это выглядит:

bU1, bU2, bU3

Я хотел бы скопировать обновленные значения в чередующийся буфер, это можно сделать с помощью какой-то одной команды, например glCopyBufferSubData? Этот не подходит, так как он принимает только смещение и размер, а не шаг (вероятно, это что-то вроде memcpy в c ++) ... Результат должен выглядеть следующим образом:

a1, bU1, c1, a2, bU2, c2, a3, bU3, c3

Если нет, то есть ли лучший подход, чем эти 2 мои?

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

  2. отдельные буферы на постоянный буфер и переменный буфер. константа останется неизменной с течением времени, но с помощью glCopyBufferSubData переменная, которая может быть обновлена ​​за один вызов.

Спасибо

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

glMapBuffer кажется лучшим решением для того, что вы делаете.

Основная идея, насколько я могу судить, состоит в том, чтобы отобразить буфер в ваше адресное пространство, а затем обновить буфер вручную, используя собственный метод обновления (вероятно, итерационный цикл).

glBindBuffer(GL_ARRAY_BUFFER, buffer_id);
void *buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

if (buffer == NULL)
  //Handle Error, usually means lack of virtual memory

for (int i = 1; i < bufferLen; i += stride /* 3, in this case */)
  buffer[i] = newValue;

glUnmapBuffer(GL_ARRAY_BUFFER);
0 голосов
/ 15 февраля 2011

Я бы отделил динамическую часть от статической (ваша точка 2).

Если вы все еще хотите сохранить их чередование в одном буфере, и у вас есть запасная видеопамять, вы можете сделатьследующее:

  1. Скопировать исходный чередующийся массив в резервный.Это требует памяти для всех компонентов, а не только для динамических, как это было изначально.
  2. Преобразование обратной связи в исходное чередование, сохраняя статические значения без изменений.
...