我目前正在尝试有效地渲染多个立方体,所以我想知道如何在 Vulkan 中使用这种“实例渲染”。
我目前只知道渲染大量(相同)对象的两种方法:
1) 多个描述符集;
2) 具有动态统一/动态偏移的单个描述符集;
在第一种情况下,浪费了大量内存,因为每个立方体只需要一个不同的模型矩阵,但每个立方体仍然使用整个 DescriptorSet:另外,因为我每帧注册一个新的命令缓冲区,所以每个立方体花费我 2' Cmd' 调用:
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, descriptorSet, 0, nullptr);
vkCmdDraw(commandBuffer, numberOfVertices, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)
但是,对于很多多维数据集,这会导致 CPU 负载不小,并浪费内存。
在第二种情况下,我只需要一个 DescriptorSet,将模型矩阵注册为 Dynamic Uniform 并用所有模型矩阵填充它;但是,我仍然需要(只需稍作修改)对每个多维数据集进行相同的 2 个“Cmd”调用:
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, descriptorSet, 1, index);
vkCmdDraw(commandBuffer, numberOfVertices, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)
和以前一样,对于很多多维数据集,尽管使用独特的 DescriptorSet 可以节省大量内存,但 CPU 负载仍然困扰着我。
所以我听说了这个“实例渲染”,它应该以某种方式告诉我们用一个命令来绘制所有立方体,为其提供模型矩阵的集合(可能仍然是一个缓冲区)。
如何做到这一点,防止我的程序使用单个调用在单个命令缓冲区中注册数千个“Cmd”?谢谢。
我有两个实体要使用相同的渲染VkPipeline,问题是它们有不同VkDescriptorSetLayout(第一个实体使用动态统一缓冲区,第二个实体仅使用标准统一缓冲区);
如何将两者传递VkDescriptorSetLayout到图形管道,然后在创建命令缓冲区期间绑定正确的管道?
有了单VkDescriptorSetLayout,我就直接把它传递给VkPipelineLayoutCreateInfo.pSetLayouts,然后VkCmdBindDescriptorSet用那个调用VkPipelineLayout。
但是对于两个VkDescriptorSetLayouts,如何正确地将它们绑定到VkPipelineLayout,然后如何在命令缓冲期间选择我想要的一个?