Vulkan Cookbook 第五章 10 创建描述符集布局

创建描述符集布局

译者注:示例代码点击此处

描述符集合在一个对象中收集许多资源(描述符)。它们稍后绑定到管线以在我们的应用程序和着色器之间建立接口。但是为了让硬件知道哪些资源被分组在一个集合中,每种类型有多少资源,以及它们的顺序是什么,我们需要创建一个描述符集布局。

怎么做...

  1. 获取逻辑设备句柄并将其存储在名为logical_device的VkDevice类型变量中。
  2. 创建一个名为bindings的VkDescriptorSetLayoutBinding元素类型的向量。
  3. 请bindings向量添加元素,稍后会将其分配给给定的描述符集。对每个新元素的成员使用以下值:
    ·为binding设置描述符中给定资源的所选索引。
    ·descriptorType为给定资源的所选类型。
    ·descriptorCount为通过着色器内的数组访问的指定类型的资源数(如果给定的资源不通过数组访问,则为1)。
    ·stageFlags为将访问资源的着色器阶段(The logical OR of all shader stages in which the resource will be accessed for stageFlags)。
    ·pImmutableSamplers为nullptr
  4. 创建名为descriptor_set_layout_create_info的VkDescriptorSetLayoutCreateInfo类型变量。使用以下值初始化其成员:
    ·sType为VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
    ·pNext为nullptr
    ·flags为0
    ·bindingCount为bindings向量的元素数
    ·pBindings为bindings向量第一个元素的指针。
  5. 创建名为descriptor_set_layout的VkDescriptorSetLayout类型的变量,其中将存储创建的布局。
  6. 调用vkCreateDescriptorSetLayout( logical_device, &descriptor_set_layout_create_info, nullptr,
    &descriptor_set_layout )
    并提供逻辑设备的句柄、指向descriptor_set_layout_create_info的指针、nullptr值和指向descriptor_set_layout的指针。
  7. 通过检查返回值是否等于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章才讲。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值