如何解决无法在Vulkan中为多个模型正确设置描述符集
尝试在Vulkan中实现多个模型时遇到问题。我使用了官方的Vulkan教程来设置大部分样板代码,然后其余部分是自定义的。目前,我可以使一个模型完美渲染,而另一个相同的模型可以渲染约60%的帧,而在其他帧中则完全不渲染,如gif:Engine output >
我尝试了许多更改以解决此问题,但我无法查明是什么原因导致了该问题。任何帮助将不胜感激。我附上了我认为最相关的代码段,但如果可以帮助解决问题,我可以添加更多代码段。
CreateCommandBuffers():
...
vkCmdBindVertexBuffers(commandBuffers[i],1,vertexBuffers,offsets);
vkCmdBindindexBuffer(commandBuffers[i],indexBuffer,VK_INDEX_TYPE_UINT32);
vkCmdBindDescriptorSets(commandBuffers[i],VK_PIPELINE_BIND_POINT_GRAPHICS,pipelineLayout,&descriptorSets[i],nullptr); //COMEBACKTO
vkCmdDrawIndexed(commandBuffers[i],models[0].getModelIndicesSize(),0);
vkCmdBindDescriptorSets(commandBuffers[i],&descriptorSets[i + 1],nullptr);
vkCmdDrawIndexed(commandBuffers[i],0);
...
createDescriptorSets():
std::vector<VkDescriptorSetLayout> layouts(swapChainImages.size() * models.size(),descriptorSetLayout);
VkDescriptorSetAllocateInfo alLocinfo{};
alLocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
alLocinfo.descriptorPool = descriptorPool;
alLocinfo.descriptorSetCount = static_cast<uint32_t>(swapChainImages.size() * models.size());
alLocinfo.pSetLayouts = layouts.data();
descriptorSets.resize(swapChainImages.size() * models.size());
if (vkAllocateDescriptorSets(device,&alLocinfo,descriptorSets.data()) != VK_SUCCESS) {
throw std::runtime_error("Failed to allocate descriptor sets!");
}
for (int i = 0; i < swapChainImages.size(); i++) {
std::vector<VkWriteDescriptorSet> descWrites;
descWrites.resize(models.size() * 2);
for (int j = 0; j < models.size(); j++) {
VkDescriptorBufferInfo bufferInfo{};
bufferInfo.offset = 0;
bufferInfo.range = sizeof(UniformBufferObject);
//bufferInfo.buffer = uniformBuffers[i];
bufferInfo.buffer = uniformBuffers[j + (i * (models.size() - 1))];
VkDescriptorImageInfo imageInfo{};
imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageInfo.imageView = textureImageView; //set these up
imageInfo.sampler = textureSampler; //set these up
int tmp = j * 2;
int tmp1 = tmp + 1;
descWrites[tmp].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descWrites[tmp].dstSet = descriptorSets[j + (i * (models.size() - 1))];
descWrites[tmp].dstBinding = 0;
descWrites[tmp].dstArrayElement = 0;
descWrites[tmp].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
descWrites[tmp].descriptorCount = 1;
descWrites[tmp].pBufferInfo = &bufferInfo;
descWrites[tmp1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descWrites[tmp1].dstSet = descriptorSets[j + (i * (models.size() - 1))];
descWrites[tmp1].dstBinding = 1;
descWrites[tmp1].dstArrayElement = 0;
descWrites[tmp1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
descWrites[tmp1].descriptorCount = 1;
descWrites[tmp1].pImageInfo = &imageInfo;
}
vkUpdateDescriptorSets(device,static_cast<uint32_t>(descWrites.size()),descWrites.data(),nullptr);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。