【发布时间】: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 的误用造成的。" 是的。一个“误用”,你有一个描述符集绑定然后更新它。 完全像错误消息所说。