Vulkan - 顶点缓冲区更新

Vulkan - vertex buffer update

我想执行顶点缓冲区更新。 我从空缓冲区开始,我将添加新点。添加的点数与帧无关。它可以每帧一个,很少或 none.

在 OpenGL 中,我只是为所有要添加的点分配内存(最大大小恒定),使用 glBufferSubData 并修改要渲染的点数(因此只有部分缓冲区可见)。

在 Vulkan 中 - 我想我需要使用最大大小不变的 createBuffer,但是修改呢?我没有找到 "dedicated" 方法。 我想这样的事:

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;

我不确定这是正确的方法。在这种情况下我需要重新创建命令缓冲区还是我应该使用完全不同的方法?

这是一种将数据添加到缓冲区的好方法。

虽然有一个小错误。应该是。

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 和您使用新点的位置之间进行一些同步。

无论如何,您都需要重新记录每帧的命令缓冲区以使用新的点数(除非您使用间接渲染?)。