【问题标题】:Is it able to call multiple drawcalls of vkCmdDrawIndexed in one render pass containing one pipeline?是否能够在一个包含一个管道的渲染通道中调用 vkCmdDrawIndexed 的多个绘制调用?
【发布时间】:2021-09-11 11:31:47
【问题描述】:

我有两个网格,包含相同的材质模板但具有不同的参数。我想把这两个网格一个一个地画出来。比如伪代码喜欢

BeginRenderPass
BindPipeline

for(auto& mesh : meshes)
{
    BindVertexBuffers(mesh.vertexBuffer)
    AddUniformBufferDescriptorSet(mesh.material)
    UpdateDescriptorSets
    BindIndexBuffer(mesh.indexBuffer)
    DrawIndexed(mesh.indexCount, 1, 0, 0, 0)
}

vkCmdEndRenderPass

我将所有网格的顶点缓冲区绑定到相同的绑定索引,并为所有统一对象使用相同的描述符集。有一些验证错误:

验证层:验证错误:[UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkDescriptorSet] 对象 0:句柄 = 0x40b43c0000000049,类型 = VK_OBJECT_TYPE_DESCRIPTOR_SET;对象 1:句柄 = 0x1c40e53df48,类型 = VK_OBJECT_TYPE_COMMAND_BUFFER; |消息 ID = 0xe8616bf2 |您正在将 vkCmdBindVertexBuffers() 添加到无效的 VkCommandBuffer 0x1c40e53df48[] 中,因为绑定的 VkDescriptorSet 0x40b43c0000000049[] 已被破坏或更新。

如何实现上述伪代码?

【问题讨论】:

  • "bound VkDescriptorSet 0x40b43c0000000049[] 被破坏或更新" 这不是告诉你你做了什么吗,和draw函数没有关系?跨度>
  • @NicolBolas 不,我只是发现它是由 vulkan API 的误用引起的。我将在下面的anwser中解释
  • "我刚刚发现这是由于 vulkan API 的误用造成的。" 是的。一个“误用”,你有一个描述符集绑定然后更新它。 完全像错误消息所说。

标签: graphics rendering vulkan


【解决方案1】:

这是我的发现(错误)。 ~~首先,结论是我不能像上面的伪代码那样实现多次绘制调用。~~因为根据vkUpdateDescriptorSets,它会使用于绑定描述符集的命令缓冲区无效,这将禁用记录下一次调用。因此出现验证错误。

我可以用不同的材质参数绘制多个网格。

有两种方式:

  • 在shader中使用push_constant配置材质参数,在draw call前通过vkCmdPushConstants设置对应的参数值。
  • 在着色器中使用统一缓冲区数组,其中每个元素都是一组材质参数。添加一个名为“material id”的附加输入属性来索引相应的统一缓冲区。然后在一次调用 vkUpdateDescriptorSets 中更新统一缓冲区数组。当前的命令缓冲区仍然可以记录下一个绘图调用命令。

第一种方式灵感来自Sascha_Willems,第二种方式是我成功实现的。

补充(更正)

我还尝试在两次绘制调用内部的一次渲染传递之前更新和绑定相应的描述符集。最后,它起作用了。请注意,需要创建两个具有相同布局绑定的单独描述符集,但需要清除图形管道以仅包含一个描述符集。

【讨论】:

  • 您还可以有多个描述符集,并为不同的对象在它们之间切换。您还可以使用动态描述符。不仅有两种选择。
  • @NicolBolas 我认为它不能为每个绘图调用执行“切换描述符集”内部渲染通道。为管道分配的描述符集应在绘制调用之前全部绑定。否则会有验证错误,我补充了我的答案。动态描述符集似乎具有相同的结果。
  • 那你对他们做错了。在绘图调用之间切换描述符集是 100% 可以的,只要您使用具有兼容布局的集切换它们。
  • @NicolBolas 好的,我会记住并在空闲时间再试一次。如果我成功实现切换描述符集,我会更新补充部分。
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多