Vulkan统一着色器数据

时间:2016-07-17 15:40:07

标签: c++ vulkan

我以前从opengl那里得到的是命令缓冲区资源内部绑定到着色器,如glUniformMatrix4fv。 现在我可以看到唯一的等价物是vkCmdPushConstants

但是也可以选择使用所有对象的数据创建一个大缓冲区。然后使用vkCmdBindDescriptorSets更改偏移量,以便着色器使用相应对象的数据(正确的是我在这里是错误的,这就是我认为可以完成的方式)。 但是现在"对"是什么?将每个对象数据提供给着色器的方法?它以什么方式依赖于着色器每个对象需要更改的数据量。

我的另一个问题与同步的gpu和cpu有关。 在将下一帧的数据复制到gpu之前,需要等待帧准备就绪。 那么如何让缓冲区复制发生在命令缓冲区中呢?类似于vkFlushMappedMemoryRanges的命令缓冲区然后您可以设置信号量并等待数据的使用完成,然后使用RAM中的下一帧的新数据覆盖gpu上的旧数据。在RAM中,为交换链中的每个图像使用单独的缓冲区,这样您就可以开始为下一帧写入数据(直到交换链图像计数)。 如果您无法同步该缓冲区副本,在我看来,您需要在gpu上使用每个swpachain图像的每个对象数据的缓冲区。这对我来说似乎是浪费空间。

我看到有点解释的问题,如果在GPU内存上的RAM中只有1个包含着色器数据的缓冲区,并且如果你不想让gpu在每帧之后空闲(我想你只想要等待,如果您已经为适合交换链的所有帧提交了命令缓冲区)

  • cpu将第0帧的对象位置推送到gpu
  • cpu提交第1帧的命令缓冲区
  • gpu开始渲染第0帧
  • cpu将第1帧的对象位置推送到gpu
  • cpu提交第1帧的命令缓冲区
  • gpu完成第0帧
  • gpu启动第1帧
  • gpu完成第1帧

在示例中,第1帧的数据已经全部推送到gpu,同时仍然呈现第0帧,这会破坏第0帧。

对不起,如果我的帖子有点语无伦次或含糊不清,但很难解释一个你不完全理解的问题。

编辑: 每顶点应该是每个对象。

我想要的功能是: VkCmdFillGpuMemory(VkCommandBuffer commandbuffer,VkDeviceMemory myMemory,void * ramData)。 最好还有一个范围选项,只复制部分数据(因此可以选择仅为数据更改的对象复制数据)

1 个答案:

答案 0 :(得分:2)

统一数据现在都必须通过pushbuffers或类似UBO的缓冲区。

VkPipelineVertexInputStateCreateInfo中使用VkGraphicsPipelineCreateInfo设置每顶点状态(顶点属性),并设置要与vkCmdBindVertexBuffers一起使用的缓冲区。

有一个vkCmdCopyBuffer可以在缓冲区之间复制数据。