创建VkDescriptorPool
在SceneWidget.h中添加bool CreateDescriptorPool函数,并添加成员变量:VkDescriptorPool m_descriptorPool = VK_NULL_HANDLE;
在SceneWidget.cpp中实现这个函数,先还先写创建函数:
VkResult result = vkCreateDescriptorPool();
其参数:
第一个参数:m_device,之前创建好的。
第二个参数:VkDescriptorPoolCreateInfo类型的指针,补一个VkDescriptorPoolCreateInfo createInfo = {};变量。
第三个参数:还是nullptr。
第四个参数:传入descriptorPool的引用。
判断返回值,是否创建成功。
createInfo的属性赋值:
固定写法
createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
默认就行
createInfo.pNext = nullptr;
createInfo.flags = 0;
在pool中允许创建的最大的descriptor set的值,每帧都会创建描述符,所以可以赋值为m_swapchainImage.size().
createInfo.maxSets = m_swapchainImage.size();
下面的两个属性的赋值,还要补充VkDescriptorPoolSize的结构。并将对象保存在std::vector<VkDescriptorPoolSize> poolSizes;中。
createInfo.poolSizeCount = poolSizes.size();
createInfo.pPoolSizes = poolSize.data();
这里的poolSizes中的对象要有两个,与CreateDescriptorSetLayout中的bindings中的个数和顺序保持一致。
包含一个类型为VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER和一个类型为VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER的对象,且descriptorCount属性的值都为m_swapchainImages.size()。
在SceneWidget::Init中调用CreateDescriptorPool(),在SceneWidget::UnInit中清理生成m_descriptorPool对象。vkDestroyDescriptorPool(m_device, m_descriptorPool, nullptr);
运行程序看一下结果:
没有报错:)