使用vulkan时记录命令的正确方法是什么?
What is the right way to record commands when using vulkan?
当我在同一个 CommandBuffer
上调用 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
时,一切都很好。
如果我在不同的 CommandBuffer
上调用这两个函数。我得到一个错误说 If commandBuffer is a primary command buffer, there must not be an active render pass instance.
并且文档说 vkCmdEndRenderPass
只能在渲染过程实例中调用。我不知道 render pass instance
究竟是什么。我想我必须在同一个 CommandBuffer
上调用这两个函数。这是否意味着我必须先记录整个帧,然后才能将任何内容提交给 GPU 进行绘制?只是感觉不对。
渲染过程是您从 vkCreateRenderPass
得到的结果;也就是说,一个 VkRenderPass
对象。将其视为代码中的 class 定义。
渲染通道 实例 是命令缓冲区内特定渲染通道处于活动状态的时间段。对于主命令缓冲区,这是 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
调用之间的 space。对于辅助命令缓冲区,整个 CB 在特定渲染通道(以及该渲染通道的单个子通道)或它的 none 中执行 在渲染过程中执行。但无论哪种方式,您都可以使用相同的 VkRenderPass
对象来创建多个渲染过程实例。
如果你想记录来自多个线程的渲染过程的命令,你可以使用辅助命令缓冲区。事实上,允许这是二级命令缓冲区存在的主要原因。
所以你有一堆线程创建一堆辅助命令缓冲区,每个都从主 CB 继承渲染过程状态。在构建辅助 CB 之后,主线程创建一个短的主命令缓冲区,仅使用 vkCmdExecuteCommands
来执行这些辅助 CB。然后您将主要 CB 提交到队列。
当我在同一个 CommandBuffer
上调用 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
时,一切都很好。
如果我在不同的 CommandBuffer
上调用这两个函数。我得到一个错误说 If commandBuffer is a primary command buffer, there must not be an active render pass instance.
并且文档说 vkCmdEndRenderPass
只能在渲染过程实例中调用。我不知道 render pass instance
究竟是什么。我想我必须在同一个 CommandBuffer
上调用这两个函数。这是否意味着我必须先记录整个帧,然后才能将任何内容提交给 GPU 进行绘制?只是感觉不对。
渲染过程是您从 vkCreateRenderPass
得到的结果;也就是说,一个 VkRenderPass
对象。将其视为代码中的 class 定义。
渲染通道 实例 是命令缓冲区内特定渲染通道处于活动状态的时间段。对于主命令缓冲区,这是 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
调用之间的 space。对于辅助命令缓冲区,整个 CB 在特定渲染通道(以及该渲染通道的单个子通道)或它的 none 中执行 在渲染过程中执行。但无论哪种方式,您都可以使用相同的 VkRenderPass
对象来创建多个渲染过程实例。
如果你想记录来自多个线程的渲染过程的命令,你可以使用辅助命令缓冲区。事实上,允许这是二级命令缓冲区存在的主要原因。
所以你有一堆线程创建一堆辅助命令缓冲区,每个都从主 CB 继承渲染过程状态。在构建辅助 CB 之后,主线程创建一个短的主命令缓冲区,仅使用 vkCmdExecuteCommands
来执行这些辅助 CB。然后您将主要 CB 提交到队列。