Проблема с правильной настройкой наборов дескрипторов для нескольких моделей в Vulkan

#graphics #vulkan #low-level

#графика #vulkan #низкоуровневый

Вопрос:

У меня возникла проблема при попытке реализовать несколько моделей в Vulkan. Я использовал официальный учебник Vulkan для настройки большей части шаблонного кода, а остальное — пользовательское. На данный момент я могу заставить одну модель отображаться идеально, в то время как другая идентичная модель отображается примерно в 60% кадров и вообще не отображается в других, как показано в gif: вывод движка

Я пытался изменить многие вещи, чтобы исправить это, но я не могу точно определить, что вызывает проблему. Любая помощь будет оценена полностью. Я прилагаю фрагменты кода, которые считаю наиболее актуальными, но я могу включить больше, если это поможет решить проблему.

CreateCommandBuffers():

 ...
vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT32);

vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, amp;descriptorSets[i], 0, nullptr); //COMEBACKTO

vkCmdDrawIndexed(commandBuffers[i], models[0].getModelIndicesSize(), 1, 0, 0, 0);

vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, amp;descriptorSets[i   1], 0, nullptr);
vkCmdDrawIndexed(commandBuffers[i], models[0].getModelIndicesSize(), 1, 0, 0, 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, amp;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 = amp;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 = amp;imageInfo;

            
        }

        vkUpdateDescriptorSets(device, static_cast<uint32_t>(descWrites.size()), descWrites.data(), 0, nullptr);
    }
  

Комментарии:

1. Попробуйте использовать j i*models.size() в качестве индекса для descWrites . 🙂

2. Спасибо за помощь, я исправил это, создав новый вектор descWrites внутри цикла j вместо цикла i и использовал 0 и 1 для индексов!

3. Вы должны добавить это в качестве ответа