[英]Descriptor Set count ambiguity in Vulkan
我想在vulkan中绘制两个对象。 为此,我按照为每个模型创建两个不同描述符集的过程进行操作。 但是,我对指定所需描述符集计数的结构感到困惑。 困扰我的要点如下:
在VkDescriptorSetLayoutBinding指定描述符计数
VkDescriptorSetLayoutBinding stagingLayoutBinding = {}; ... stagingLayoutBinding.descriptorCount = 1; <- i have one mat4 element for each descriptors
在VkDescriptorPoolSize指定描述符计数
VkDescriptorPoolSize stagingPoolSize = {}; ... stagingPoolSize.descriptorCount = static_cast<uint32_t>(model.size()); <- allocate two descriptor sets from one descriptor pool
在VkDescriptorPoolCreateInfo中指定最大值集
VkDescriptorPoolCreateInfo poolInfo = {}; ... poolInfo.maxSets = model.size(); <- max descriptor sets = 2
最后在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个(或更多)描述符集布局。 如果您希望描述符集共享布局,则只需多次提供相同的布局。
至于令人困惑的领域:
VkDescriptorSetLayoutBinding
结构的descriptorCount
成员是绑定中包含的描述符数,在着色器中作为数组访问。 这里通常会提供1
,除非您想要创建给定类型的描述符数组(例如采样图像数组),那么您需要提供更大的值。 VkDescriptorPoolSize
descriptorCount
成员指定可以从给定池分配给定类型的描述符的数量。 此值与总描述符集无关,例如,您可以创建一个描述符池,您可以从中分配总共3个描述符集,但总共只能分配2个存储库。 maxSets
所述的构件VkDescriptorPoolCreateInfo
结构限定多少描述符集可以从一个给定的池(其中可以从池中被分配集的总数目)进行分配。 同样,此值定义“整个”集,而前一个值(来自项目符号2)定义特定描述符。 VkDescriptorSetAllocateInfo
结构的descriptorSetCount
成员指定在给定时刻(在vkAllocateDescriptorSets()
函数调用期间vkAllocateDescriptorSets()
要分配的描述符集数量。 例如,您可以创建一个池,您可以从中分配10个描述符集,但是您希望一次只调用一个描述符集,方法是调用vkAllocateDescriptorSets()
函数10次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.