微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在Vulkan中为多个模型正确设置描述符集

如何解决无法在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 举报,一经查实,本站将立刻删除。