Vulkan - обновление буфера вершин - PullRequest
0 голосов
/ 14 января 2020

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

В OpenGL я просто выделил память для всех точек, которые будут добавлены (постоянный максимальный размер), использовал glBufferSubData и изменил количество точек, которые будут отображаться ( поэтому будет видна только часть буфера).

В Vulkan - я полагаю, мне нужно будет использовать createBuffer с постоянным максимальным размером, но как насчет модификаций? Я не нашел "преданного" подхода для этого. Я думаю о чем-то вроде:

void* data;
vkMapMemory(src, data);
memcpy(data, modifiedInput);
vkUnmapMemory(src);

VkBufferCopy copyParams = {};
copyRegion.srcOffset = currOffset;//starting from last point in buffer
copyRegion.dstOffset = copyRegion.srcOffset;
copyRegion.size = size;

vkCmdCopyBuffer(src, dest, copyParams);
currOffset += size;

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

1 Ответ

1 голос
/ 14 января 2020

Это достаточно хороший способ добавить данные в буфер.

Хотя есть небольшая ошибка. Это должно быть.

VkBufferCopy copyParams = {};
copyRegion.srcOffset = 0; //start copy from start of src
copyRegion.dstOffset = currOffset; //starting from last point in existing buffer
copyRegion.size = size;

Предполагается, что вы загружаете только новые точки. И убедитесь, что вы не переполняете буфер; разделение копии на 2 копии при ее переносе.

Вы также можете использовать vkCmdUpdateBuffer, чтобы пропустить, используя промежуточный буфер. Хотя это должно быть только для маленьких битов данных.

Вам все еще нужна некоторая синхронизация между vkCmdCopyBuffer и местом, где вы используете новые точки.

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

...