如何一次更新多个描述符集
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,其中最后一次循环迭代的数据仍然存在。这就是最后一个渲染目标显示预期结果的原因。
我从我的交换链中创建了多个渲染目标,并为每个目标创建了一个 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,其中最后一次循环迭代的数据仍然存在。这就是最后一个渲染目标显示预期结果的原因。