我正在尝试创建一个带有布局的单个管道,它需要两个绑定,一个动态 UBO 和一个图像/采样器绑定。我希望每个绑定都来自一个单独的描述符集,所以我会为每个绘制调用绑定两个描述符集。一个描述符集用于每个对象的纹理,另一个用于动态 UBO(在对象之间共享)。我希望能够在渲染部分做这样的事情:
commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline);
for (int ii = 0; ii < mActiveQuads; ii++)
{
uint32_t dynamicOffset = ii * static_cast<uint32_t>(dynamicAlignment);
// bind texture for this quad
commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, sharedPipelineLayout, 0, 1,
&swapResources[current_buffer].textureDescriptors[ii], 1, &dynamicOffset);
// draw the dynamic UBO with offset for this quad
commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, sharedPipelineLayout, 0, 1,
&swapResources[current_buffer].quadDescriptor, 1, &dynamicOffset);
commandBuffer.draw(2 * 3, 1, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。首先,我不确定我是否了解有关描述符集和管道布局的所有内容,以了解我的操作是否被允许。这甚至有意义吗?我可以创建一个具有 2 个绑定布局的管道,但是创建每个描述符来填充每个绑定中的一个,然后为该管道的每个绘制调用绑定两个描述符?
如果允许的话。这就是我创建管道和描述符的方式:
vk::DescriptorSetLayoutBinding const layout_bindings[2] = { vk::DescriptorSetLayoutBinding()
.setBinding(0)
.setDescriptorType(vk::DescriptorType::eUniformBufferDynamic)
.setDescriptorCount(1)
.setStageFlags(vk::ShaderStageFlagBits::eVertex)
.setPImmutableSamplers(nullptr),
vk::DescriptorSetLayoutBinding()
.setBinding(1)
.setDescriptorType(vk::DescriptorType::eCombinedImageSampler)
.setDescriptorCount(1)//texture_count)
.setStageFlags(vk::ShaderStageFlagBits::eFragment)
.setPImmutableSamplers(nullptr) …Run Code Online (Sandbox Code Playgroud)