为什么多个顶点缓冲区绑定应该是连续的?

时间:2018-01-24 10:38:35

标签: vulkan

我为它们创建了几个顶点缓冲区和绑定:

VkVertexInputBindingDescription binding1{0, stride1, VK_VERTEX_INPUT_RATE_VERTEX};
VkVertexInputBindingDescription binding2{1, stride2, VK_VERTEX_INPUT_RATE_VERTEX};

在这里你可以看到连续的0和1绑定索引。

接下来我录制一个命令缓冲区:

vkCmdBindVertexBuffers(commandBuffer, 0, 1, &buffer1, &offset);
vkCmdBindVertexBuffers(commandBuffer, 1, 1, &buffer2, &offset);

我知道,这可以在一个电话中完成,但请留在我身边。

现在我尝试非连续绑定:

VkVertexInputBindingDescription binding1{0, stride1, VK_VERTEX_INPUT_RATE_VERTEX};
VkVertexInputBindingDescription binding2{2, stride2, VK_VERTEX_INPUT_RATE_VERTEX};

vkCmdBindVertexBuffers(commandBuffer, 0, 1, &buffer1, &offset);
vkCmdBindVertexBuffers(commandBuffer, 2, 1, &buffer2, &offset);

注意0和2个非连续的绑定索引。

在两种情况下渲染的模型确实都是正确的,但在第二种情况下,我得到validation layer: Cannot submit cmd buffer using deleted buffer 0x0.警告。为什么呢?

1 个答案:

答案 0 :(得分:2)

这看起来像验证层中的错误。它们通过已设置的最高绑定跟踪绑定零中当前绑定的缓冲区,并且在提交命令缓冲区时,它们只检查所有这些绑定是否都绑定了有效的缓冲区。但是规范只要求顶点输入变量实际引用的绑定具有绑定的有效缓冲区。如果您可以在https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers提交错误,那就太好了。