【问题标题】:Descriptor Set count ambiguity in VulkanVulkan中的描述符集计数歧义
【发布时间】:2019-01-13 21:42:02
【问题描述】:

我想在 vulkan 中绘制两个对象。为了实现这一点,我遵循为每个模型创建两个不同描述符集的过程。但是,我对指定所需描述符集计数的结构感到困惑。让我困惑的点如下:

  1. VkDescriptorSetLayoutBinding

    处指定描述符计数
    VkDescriptorSetLayoutBinding stagingLayoutBinding = {};
    ...
    stagingLayoutBinding.descriptorCount = 1;   <- i have one mat4 element for each descriptors 
    
  2. VkDescriptorPoolSize

    处指定描述符计数
    VkDescriptorPoolSize stagingPoolSize = {};
    ...
    stagingPoolSize.descriptorCount = static_cast<uint32_t>(model.size());  <- allocate two descriptor sets from one descriptor pool
    
  3. VkDescriptorPoolCreateInfo

    处指定最大集
    VkDescriptorPoolCreateInfo poolInfo = {};
    ...
    poolInfo.maxSets = model.size();   <- max descriptor sets = 2
    
  4. 最后在VkDescriptorSetAllocateInfo

    处指定描述符集的创建
    VkDescriptorSetAllocateInfo allocInfo = {};
    ...
    allocInfo.descriptorSetCount = static_cast<uint32_t>(model.size());
    

但是在vkAllocateDescriptorSets(device, &amp;allocInfo, descriptorSet.data())处抛出异常,验证层调试信息如下:-

validation Layer: Object: 0xcccccccccccccccc (Type = 20) | Invalid DescriptorSetLayout Object 0xcccccccccccccccc. The spec valid usage text states 'pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter)

我的描述符创建代码如下:

    VkDescriptorSetLayout layouts[] = { descriptorSetLayout };

    descriptorSet.resize(model.size());
    VkDescriptorSetAllocateInfo allocInfo = {};
    allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
    allocInfo.descriptorPool = descriptorPool[0];
    allocInfo.descriptorSetCount = static_cast<uint32_t>(model.size());
    allocInfo.pSetLayouts = layouts;

    if (vkAllocateDescriptorSets(device, &allocInfo, descriptorSet.data()) != VK_SUCCESS)
    {
        throw std::runtime_error("failed to allocate descriptor set !");
    }

我想我在某处输入了错误的描述符集计数。

【问题讨论】:

    标签: c++ graphics 3d vulkan


    【解决方案1】:

    问题可能出在这里:

    allocInfo.descriptorSetCount = static_cast<uint32_t>(model.size());
    

    如果您想绘制 2 个对象而不是我假设 model.size() 返回 2。然而,您只提供了一个描述符集布局:

    VkDescriptorSetLayout layouts[] = { descriptorSetLayout };
    

    如果您想分配 2 个(或更多)描述符集,您需要提供 2 个(或更多)描述符集布局。如果您希望描述符集共享布局,您只需要多次提供相同的布局即可。

    至于令人困惑的领域:

    1. descriptorCount VkDescriptorSetLayoutBinding 结构的成员是绑定中包含的描述符的数量,在着色器中作为数组访问。通常这里会提供1,除非你想创建一个给定类型的描述符数组(例如一个采样图像数组),那么你需要提供一个更大的值。
    2. descriptorCount 的成员 VkDescriptorPoolSize 指定可以从给定池中分配多少给定类型的描述符。该值与描述符集的总数无关,例如您可以创建一个描述符池,从中您可以总共分配 3 个描述符集,但总共只能分配 2 个存储映像。
    3. maxSets VkDescriptorPoolCreateInfo 结构的成员定义了可以从给定池中分配多少描述符集(可以从池中分配的总集数)。同样,这个值定义了“整体”集合,而之前的值(来自第 2 条)定义了特定的描述符。
    4. descriptorSetCount VkDescriptorSetAllocateInfo 结构的成员指定在给定时刻(在vkAllocateDescriptorSets() 函数调用期间)要分配多少描述符集。例如,您可以通过调用vkAllocateDescriptorSets() 函数 10 次来创建一个池,从中可以分配 10 个描述符集,但您希望一次只分配一个描述符集。

    【讨论】:

    • 我想使用一个描述符集布局分配两个描述符集,所以我必须设置allocInfo.descriptorSetCount = 2(model.size() 返回2),我还修改了allocInfo.pSetLayouts = &amp;descriptorSetLayout;,但是我仍然收到同样的错误,对于vkAllocateDescriptorSets(),我应该为分配创建一个for循环吗?还是我当前的代码没问题?
    • @BulBul &amp;descriptorSetLayout 指向单个描述符集布局。你应该有类似的东西:VkDescriptorSetLayout layouts[] = { descriptorSetLayout, descriptorSetLayout };allocInfo.pSetLayouts = layouts;
    • 对我有用,现在我对描述符集有了更好的理解,感谢您的帮助。
    猜你喜欢
    • 2018-12-04
    • 2019-10-18
    • 2021-04-08
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多