簡體   English   中英

描述符設置Vulkan中的計數歧義

[英]Descriptor Set count ambiguity in Vulkan

我想在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, &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 !");
    }

我認為我在某處提供錯誤的描述符集計數。

問題可能在這里:

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

如果你想繪制2個對象而不是我假設model.size()返回2 但是,您只提供一個描述符集布局:

VkDescriptorSetLayout layouts[] = { descriptorSetLayout };

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

至於令人困惑的領域:

  1. VkDescriptorSetLayoutBinding結構的descriptorCount成員是綁定中包含的描述符數,在着色器中作為數組訪問。 這里通常會提供1 ,除非您想要創建給定類型的描述符數組(例如采樣圖像數組),那么您需要提供更大的值。
  2. VkDescriptorPoolSize descriptorCount成員指定可以從給定池分配給定類型的描述符的數量。 此值與總描述符集無關,例如,您可以創建一個描述符池,您可以從中分配總共3個描述符集,但總共只能分配2個存儲庫。
  3. maxSets所述的構件VkDescriptorPoolCreateInfo結構限定多少描述符集可以從一個給定的池(其中可以從池中被分配集的總數目)進行分配。 同樣,此值定義“整個”集,而前一個值(來自項目符號2)定義特定描述符。
  4. VkDescriptorSetAllocateInfo結構的descriptorSetCount成員指定在給定時刻(在vkAllocateDescriptorSets()函數調用期間vkAllocateDescriptorSets()要分配的描述符集數量。 例如,您可以創建一個池,您可以從中分配10個描述符集,但是您希望一次只調用一個描述符集,方法是調用vkAllocateDescriptorSets()函數10次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM