当我在同一vkCmdBeginRenderPass
上调用vkCmdEndRenderPass
和CommandBuffer
时,一切都很好。
如果我在不同的CommandBuffer
上调用这两个函数。我收到一个错误,说If commandBuffer is a primary command buffer, there must not be an active render pass instance.
,文档说vkCmdEndRenderPass
只能在渲染过程实例内部调用。我不知道render pass instance
到底是什么。我想我必须在同一CommandBuffer
上调用这两个函数。这是否意味着我必须先记录整个帧,然后才能将任何内容提交给GPU进行绘制?只是感觉不对。
答案 0 :(得分:2)
渲染过程是您从vkCreateRenderPass
获得的回报;即VkRenderPass
对象。可以将其视为代码中的类定义。
渲染过程 instance 是命令缓冲区内激活特定渲染过程的时间段。对于主命令缓冲区,这是vkCmdBeginRenderPass
和vkCmdEndRenderPass
调用之间的空间。对于辅助命令缓冲区, entire CB在特定渲染阶段(以及该渲染阶段的单个子阶段)内执行,或者都不在渲染阶段执行。但是无论哪种方式,您都可以使用相同的VkRenderPass
对象来创建多个渲染过程实例。
如果要记录来自多个线程的渲染过程命令,请使用辅助命令缓冲区。确实,允许这样做是根本没有辅助命令缓冲区的主要原因。
因此,您有一堆线程创建了一堆辅助命令缓冲区,每个辅助命令缓冲区都从主CB继承了渲染通过状态。构建辅助CB之后,主线程将创建一个简短的主要命令缓冲区,该缓冲区仅使用vkCmdExecuteCommands
来执行那些辅助CB。然后将主CB提交到队列。