gpt4 book ai didi

pipeline - Vulkan:一个管道和多个描述符集?

转载 作者:行者123 更新时间:2023-12-04 02:48:09 26 4
gpt4 key购买 nike

我正在尝试创建一个具有布局的单一管道,它需要两个绑定(bind),一个动态 UBO 和一个图像/采样器绑定(bind)。我希望每个绑定(bind)都来自一个单独的描述符集,因此我会在每个绘制调用中绑定(bind)两个描述符集。一个描述符集用于每个对象的纹理,另一个用于动态 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);
}

但这似乎行不通。首先,我不确定我是否了解有关描述符集和管道布局的所有内容,以了解我正在做的事情是否被允许。这甚至有意义吗?我可以创建一个具有 2 个绑定(bind)布局的管道,但创建每个描述符以分别填充这些绑定(bind)中的一个,然后为该管道的每个绘制调用绑定(bind)两个描述符?

如果允许的话。这就是我创建管道和描述符的方式:

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) };


// note binding count is 1 here
auto const descriptor_layout = vk::DescriptorSetLayoutCreateInfo().setBindingCount(1).setPBindings(&layout_bindings[0]); // using the first part of the above layout
device.createDescriptorSetLayout(&descriptor_layout, nullptr, &quadDescriptorLayout);

// note binding count is 1 here
auto const descriptor_layout2 = vk::DescriptorSetLayoutCreateInfo().setBindingCount(1).setPBindings(&layout_bindings[1]); // using the second part of the above layout
device.createDescriptorSetLayout(&descriptor_layout2, nullptr, &textureDescriptorLayout);

// Now create the pipeline, note we use both the bindings above with
// layout count = 2
auto const pPipelineLayoutCreateInfo = vk::PipelineLayoutCreateInfo().setSetLayoutCount(2).setPSetLayouts(desc_layout);
device.createPipelineLayout(&pPipelineLayoutCreateInfo, nullptr, &sharedPipelineLayout);

和描述符本身:

    // alloc quad descriptor
alloc_info =
vk::DescriptorSetAllocateInfo()
.setDescriptorPool(desc_pool)
.setDescriptorSetCount(1)
.setPSetLayouts(&quadDescriptorLayout);


// texture descriptors(multiple descriptors, one per quad object)
alloc_info =
vk::DescriptorSetAllocateInfo()
.setDescriptorPool(desc_pool)
.setDescriptorSetCount(1)
.setPSetLayouts(&textureDescriptorLayout);

以前,纹理和 UBO 在单个描述符集中工作正常,我可以看到多个四边形,但都共享一个纹理。当我将纹理拆分为不同的描述符集时,我就得到了一个挂起的应用程序。我在尝试提交图形队列时收到“设备丢失”错误。

任何关于这是否可行或我在我的设置中做错了什么的见解将不胜感激。非常感谢!

下面添加Shader代码:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(binding = 0) uniform UniformBufferObject {
mat4 mvp;
vec4 position[6];
vec4 attr[6];
} ubo;


layout(location = 0) out vec2 fragTexCoord;

void main() {
gl_Position = ubo.mvp *ubo.position[gl_VertexIndex];
fragTexCoord = vec2(ubo.attr[gl_VertexIndex].x, ubo.attr[gl_VertexIndex].y);
}

像素着色器:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(set=0, binding = 1) uniform sampler2D texSampler;

layout(location = 0) in vec2 fragTexCoord;

layout(location = 0) out vec4 outColor;

void main() {
outColor = texture(texSampler, fragTexCoord);
}

最佳答案

是的,你可以做到这一点。您的管道布局有两个描述符集。两个描述符集布局中的每一个都有一个描述符:一个动态 UBO 和一个纹理。在绘制时,您将每个描述符集布局的一个描述符集绑定(bind)到适当的设置编号。

看起来绑定(bind)纹理描述符集时的firstSet参数是错误的:那是管道布局中的第二个集,所以它有索引1,但是你'重新传递 0。验证层应该警告您,您正在绑定(bind)一个描述符集,其布局与管道布局对该集的期望不匹配。

您没有显示访问这些的着色器代码,因此您可能已经这样做了。但是当从单个描述符集变为两个描述符集时,您需要更新采样器绑定(bind)中的集合索引。

关于pipeline - Vulkan:一个管道和多个描述符集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com