如何一次更新多个描述符集

How update multiply descriptorSets at once

我从我的交换链中创建了多个渲染目标,并为每个目标创建了一个 descriptorSet。这个想法是为每个 renderTarget 创建一个 commandBuffer 并绑定等效的描述符。现在我想通过一次调用 updateDescriptorSets 来更新 descriptorSets 并使用:

std::vector<vk::WriteDescriptorSet> writes;

for( UINT32 index = 0; index < descriptorSets.size(); ++index )
{
    writes.push_back( 
        vk::WriteDescriptorSet( descriptorSets[index], 0, 0, 1, 
                                vk::DescriptorType::eStorageImage,
                                &vk::DescriptorImageInfo( vk::Sampler(), imageViews[index], vk::ImageLayout::eGeneral ),
                                nullptr,
                                nullptr ) );
}

device.updateDescriptorSets( writes.size(), writes.data(), 0, nullptr );

使用这种方法,只有 queue 中的最后一个 renderTarget 会呈现所需的结果。其他的只产生黑屏。 但是当我调用 updateDescriptorSets 乘法时,一切都像预期的那样工作:

std::vector<vk::WriteDescriptorSet> writes;

for( UINT32 index = 0; index < descriptorSets.size(); ++index )
{
    writes.push_back( 
        vk::WriteDescriptorSet( descriptorSets[index], 0, 0, 1, 
                                vk::DescriptorType::eStorageImage,
                                &vk::DescriptorImageInfo( vk::Sampler(), imageViews[index], vk::ImageLayout::eGeneral ),
                                nullptr,
                                nullptr ) );
   device.updateDescriptorSets( writes.size(), writes.data(), 0, nullptr );
   writes.clear();
}

我认为我可以一次更新多个 descriptorSets。所以这是不可能的,或者还有什么可能是我的错误。

PS:我使用来自 vulkan SDK 的 c++ Header

Bug确实在应用程序代码中。

问题出在vk::DescriptorImageInfo的创建上。在这两个代码示例中,结构仅存在于 for 循环的范围内,但在 vk::WriteDescriptorSet 结构中仅复制指向该结构的指针。

第一个例子中的updateDescriptorSets处理structs中的数据时,相关数据超出范围,指针无效。巧合的是,应用程序在循环的每次迭代中始终使用相同的内存 space,因此指针指向相同的无效 space,其中最后一次循环迭代的数据仍然存在。这就是最后一个渲染目标显示预期结果的原因。