【问题标题】:Vulkan - vertex buffer updateVulkan - 顶点缓冲区更新
【发布时间】:2020-01-14 11:26:19
【问题描述】:

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

在 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;

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

【问题讨论】:

    标签: buffer vulkan vertex


    【解决方案1】:

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

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

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

    假设您只上传新点。并确保您不会溢出缓冲区;包装时将副本分成两份。

    您也可以使用vkCmdUpdateBuffer 跳过使用暂存缓冲区。虽然这应该只适用于少量数据。

    您仍然需要在vkCmdCopyBuffer 和您使用新点的位置之间进行一些同步。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多