小编Sho*_*ing的帖子

在 Vulkan 中实现“实例渲染”的正确方法是什么?

我目前正在尝试有效地渲染多个立方体,所以我想知道如何在 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”?谢谢。

c++ instance vulkan

8
推荐指数
2
解决办法
1万
查看次数

同一个VkPipeline有多个VkDescriptorSetLayout?

我有两个实体要使用相同的渲染VkPipeline,问题是它们有不同VkDescriptorSetLayout(第一个实体使用动态统一缓冲区,第二个实体仅使用标准统一缓冲区);

如何将两者传递VkDescriptorSetLayout到图形管道,然后在创建命令缓冲区期间绑定正确的管道?

有了单VkDescriptorSetLayout,我就直接把它传递给VkPipelineLayoutCreateInfo.pSetLayouts,然后VkCmdBindDescriptorSet用那个调用VkPipelineLayout

但是对于两个VkDescriptorSetLayouts,如何正确地将它们绑定到VkPipelineLayout,然后如何在命令缓冲期间选择我想要的一个?

c++ vulkan

1
推荐指数
1
解决办法
1081
查看次数

标签 统计

c++ ×2

vulkan ×2

instance ×1