创建描述符集布局
译者注:示例代码点击此处
描述符集合在一个对象中收集许多资源(描述符)。它们稍后绑定到管线以在我们的应用程序和着色器之间建立接口。但是为了让硬件知道哪些资源被分组在一个集合中,每种类型有多少资源,以及它们的顺序是什么,我们需要创建一个描述符集布局。
怎么做...
- 获取逻辑设备句柄并将其存储在名为logical_device的VkDevice类型变量中。
- 创建一个名为bindings的VkDescriptorSetLayoutBinding元素类型的向量。
- 请bindings向量添加元素,稍后会将其分配给给定的描述符集。对每个新元素的成员使用以下值:
·为binding设置描述符中给定资源的所选索引。
·descriptorType为给定资源的所选类型。
·descriptorCount为通过着色器内的数组访问的指定类型的资源数(如果给定的资源不通过数组访问,则为1)。
·stageFlags为将访问资源的着色器阶段(The logical OR of all shader stages in which the resource will be accessed for stageFlags)。
·pImmutableSamplers为nullptr - 创建名为descriptor_set_layout_create_info的VkDescriptorSetLayoutCreateInfo类型变量。使用以下值初始化其成员:
·sType为VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
·pNext为nullptr
·flags为0
·bindingCount为bindings向量的元素数
·pBindings为bindings向量第一个元素的指针。 - 创建名为descriptor_set_layout的VkDescriptorSetLayout类型的变量,其中将存储创建的布局。
- 调用vkCreateDescriptorSetLayout( logical_device, &descriptor_set_layout_create_info, nullptr,
&descriptor_set_layout )并提供逻辑设备的句柄、指向descriptor_set_layout_create_info的指针、nullptr值和指向descriptor_set_layout的指针。 - 通过检查返回值是否等于VK_SUCCESS来确保调用成功。
这个怎么运作...
描述符集布局指定描述符集的内部结构,同时严格指定哪些资源可以绑定到描述符集(我们不能使用除布局中指定的资源之外的资源)。
当我们想要创建布局时,需要知道将使用哪些资源(描述符类型)以及它们的顺序。顺序是通过绑定来指定的,它们定义了给定集合中中资源的索引(位置),也在着色器(通过layout限定符设置一个编号)来制定我们要访问的资源:
layout (set=m, binding=n) // variable definition
我们可以为绑定选择任何值,但应该记住,未使用的索引可能会占用内存并影响应用程序的性能。
提示:为了避免不必要的内存开销和负面的性能影响,我们应该保持描述符绑定尽可能紧凑和接近0。
VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info = {
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
nullptr,
0,
static_cast<uint32_t>(bindings.size()),
bindings.data()
};
接下来,我们可以这样创建布局:
VkResult result = vkCreateDescriptorSetLayout( logical_device, &descriptor_set_layout_create_info, nullptr, &descriptor_set_layout );
if( VK_SUCCESS != result ) {
std::cout << "Could not create a layout for descriptor sets." << std::endl;
return false;
}
return true;
描述符集布局(以及推送常量范围)也形成管线布局(pipeline layout),该布局定义给定管线可以访问哪种类型的资源。在描述符集分配期间,除了创建管线布局外,还需要创建描述符集布局。
译者注:上句原文Descriptor set layouts (along with push constant ranges) also form a pipeline layout, which defines what type of resources can be accessed by a given pipeline. Created layouts, apart from pipeline layout creation, are also required during descriptor set allocation.管线布局这玩意在第8章才讲。