【发布时间】:2019-01-13 21:42:02
【问题描述】:
我想在 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 !");
}
我想我在某处输入了错误的描述符集计数。
【问题讨论】: