Vulkan教程翻译之十 创建 Descriptor Set

2023-11-12

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/09-init_descriptor_set.html

创建 Descriptor Set

这一章节的代码文件是 09-init_descriptor_set.cpp

回到 pipeline_layout 例子中,你定义了 descriptor set layout,但是实际上没有分配它。回想一下,你定义 descriptor set 是用来通知 GPU 如何把 uniform buffer 包含的数据映射成 shader 程序的 uniform 变量。现在你可以进行分配和初始化了。

Descriptor Pool

像 command buffer 那样,descriptor set 也是从一个池里分配。所以你必须首先创建这个池。因为你已经知道只需要一个 descriptor set 来对应 uniform buffer,创建池就简单了:

VkDescriptorPoolSize type_count[1];
type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
type_count[0].descriptorCount = 1;

VkDescriptorPoolCreateInfo descriptor_pool = {};
descriptor_pool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
descriptor_pool.pNext = NULL;
descriptor_pool.maxSets = 1;
descriptor_pool.poolSizeCount = 1;
descriptor_pool.pPoolSizes = type_count;

res = vkCreateDescriptorPool(info.device, &descriptor_pool, NULL,
                             &info.desc_pool);

从池里分配 Descriptor Set

现在你可以从池里分配一个 descriptor set 了。注意你必须提供你在 pipeline_layout 例子中定义的 descriptor set layout。该layout 描述了 descriptor set 如何被分配:

VkDescriptorSetAllocateInfo alloc_info[1];
alloc_info[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
alloc_info[0].pNext = NULL;
alloc_info[0].descriptorPool = info.desc_pool;
alloc_info[0].descriptorSetCount = NUM_DESCRIPTOR_SETS;
alloc_info[0].pSetLayouts = info.desc_layout.data();
info.desc_set.resize(NUM_DESCRIPTOR_SETS);
res = vkAllocateDescriptorSets(info.device, alloc_info, info.desc_set.data());

更新 Descriptor Set

注意你实际上还没有在任何地方使用这个 uniform buffer 的句柄。在你创建 uniform buffer 的时候,你把它的信息隐藏在一个命名为 info.uniform_data.buffer_info 的 VkDescriptorBufferInfo 结构体里。查看 init_uniform_buffer() 函数来了解 info.uniform_data.buffer_info 是如何初始化的。

info.uniform_data.buffer_info 是这样一个实例:

typedef struct VkDescriptorBufferInfo {
    VkBuffer        buffer;
    VkDeviceSize    offset;
    VkDeviceSize    range;
} VkDescriptorBufferInfo;

其中的 buffer 成员包含了该 uniform buffer 的句柄。

VkWriteDescriptorSet writes[1];
writes[0] = {};
writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writes[0].pNext = NULL;
writes[0].dstSet = info.desc_set[0];
writes[0].descriptorCount = 1;
writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writes[0].pBufferInfo = &info.uniform_data.buffer_info;
writes[0].dstArrayElement = 0;
writes[0].dstBinding = 0;

vkUpdateDescriptorSets(info.device, 1, writes, 0, NULL);

以上步骤本质上是拷贝 VkDescriptorBufferInfo 到 descriptor,可能是在设备内存中。

这个 buffer info 包含了 uniform buffer 的句柄,还有偏移值和关联的数据大小。目前情况下,uniform buffer 只包含了 MVP 变换,所以偏移值是0,大小就是MVP的大小,按照 pipeline_layout 例子里设置的 info.uniform_data.buffer_info。一个 descriptor 确切的按字节的布局可能是特殊实现的,所以对你是不透明的。这也是为什么你要使用 Vulkan 驱动函数来操作 descriptor,而不是自己去映射写入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vulkan教程翻译之十 创建 Descriptor Set 的相关文章

  • Vulkan下多线程渲染设计

    1 Vulkan 视角下的多线程渲染 首先我们需要从vulkan api的顶层框架上来看一下 它在哪些地方可以让我们并行 Vulkan API的基本框架 Vulkan不同于Gles只有一个 不被API暴露出来的 单一链条的cmdbuffer
  • ray tracing of Embree

    GitHub embree embree Embree ray tracing kernels repository Intel Embree is a collection of high performance ray tracing
  • Vulkan基础

    目录 一 Vulkan开发理论基础知识 接口设计理念 Host Device 基础设施 元数据和设备 基础设施 交换链 编辑交换链 SwapChain 编辑 渲染管线 Pipeline RenderPass CommandBuffer 二
  • Vulkan教程 - 17 描述符与内存对齐

    之前章节的描述符布局描述了描述符可以绑定的类型 本章我们要对每个VkBuffer资源创建一个描述符集合来将它绑定到统一缓冲描述符上 描述符集合不能够直接创建 必须从一个池中分配 就和命令缓冲一样 同样的 对应也有描述符池 写一个新方法cre
  • Vulkan同步机制和图形-计算-图形转换的风险(二)

    利用乒乓机制的交错队列减少风险 在本篇文章中 我们将提到Vulkan 图形处理过程中夹杂计算任务时遇到的各式问题 为更准确地了解我们的话题 可查看文章第一部分 第一部分概述了在Vulkan中如何使用barrier 具体来说 涉及图形 计算b
  • GLSL-TBN矩阵

    TBN矩阵 一 简述 1 1 TBN矩阵作用 我们研究一个矩阵的时候通常需要了解一个矩阵是从哪一个空间或者说矩阵而来的 如果搜索一下TBN矩阵运算公式可以发现其决定于物体坐标系下的顶点和纹理坐标系下的纹理坐标 想到这里我们需要明确TBN运算
  • Vulkan 绘制显示设计

    背景 众所周知 Vulkan是个跨平台的图形渲染API 为了友好地支持跨平台 Vulkan自然也抽象出了很多接口层去对接各个操作系统 抹平系统间的差异 Swap Chains即为WSI 其本质上是一种图像队列 此队列会按顺序依次将队列中的若
  • 着色器中包围体层次结构的遍历

    我正在使用 vulkan 计算着色器开发路径跟踪器 我实现了一棵树代表包围体层次结构 BVH 的想法是最大限度地减少需要执行光线相交测试的对象数量 1 简单的实施 我的第一个实现非常快 它遍历树到singleBVH 树的叶子 然而 射线可能
  • 线性化深度

    在 OpenGL 中 您可以像这样线性化深度值 float linearize depth float d float zNear float zFar float z n 2 0 d 1 0 return 2 0 zNear zFar z
  • Vulkan 的 VkAllocationCallbacks 使用 malloc/free() 实现

    我正在阅读Vulkan 内存分配 内存主机似乎 VkAllocationCallbacks 可以使用简单的 malloc realloc free 函数来实现 typedef struct VkAllocationCallbacks voi
  • Wat 执行“vkCreateSwapchainKHR:内部可绘制对象创建失败”。方法

    我总是卡在交换链的创建上 我不知道为什么 我启用了验证层 我得到的最好的答案是 vkCreateSwapchainKHR 内部绘图创建失败 我有一张 Nvidia GTX960 卡 我在它上面运行了一些 vulkan 样本 所以它必须支持
  • MacOS - 当 VkPhysicalDeviceFeatures WideLines = VK_TURE 且不支持 vkCmdSetLineWidth API 时,Vulkan 在运行时 vkCreateDevice() 失败

    我是 Vulkan 新手 最近开始学习 我在运行时遇到问题vkCreateDevice 失败 当VkPhysicalDeviceFeatures是启用与 VkPhysicalDeviceFeatures 功能 features wideLi
  • 如何使 VK_LAYER_KHRONOS_validation 可用?

    解决方案 卸载 vulkan 在注册表 HKLM SOFTWARE Khronos Vulkan ExplicitLayers 和 HKLM SOFTWARE WOW6432Node Khronos Vulkan ExplicitLayer
  • Vulkan 中的 VKAPI_ATTR 和 VKAPI_CALL 宏

    我一直在寻找但我仍然不确定what VKAPI ATTR and VKAPI CALL是 我不确定它们是否应该是一个宏或一些我不知道的奇特的 C 函数声明 What is VKAPI ATTR void VKAPI CALL vkComma
  • 在 Vulkan 中重新绑定图形管道是否保证无操作?

    在简化的场景中 每个要渲染的对象都被转换为辅助命令缓冲区 并且每个命令缓冲区最初都绑定一个图形管道 是否可以保证无操作来绑定之前立即绑定的管道 或者辅助命令缓冲区的执行顺序根本无法保证 是否可以保证无操作来绑定之前立即绑定的管道 不 事实上
  • Vulkan命令执行顺序

    引用Vulkan 1 0规范文档 chapter 5 Command Buffers 第4段 除非另有说明 并且没有显式同步 否则通过命令缓冲区提交到队列的各种命令可以按相对于彼此的任意顺序执行 和 或同时执行 在第2 1 1章 队列操作
  • 如何为已渲染的多个3D模型拥有多个模型矩阵?

    我已经遵循了 vulkan 教程的大部分内容 https vulkan tutorial com https vulkan tutorial com 我目前有一个 vulkan 程序 可以使用 OBJ 文件加载多个 3D 模型 但是我只有一
  • Vulkan:上传 3 通道图像到设备

    假设主机端有一个3通道图像 float或uint8 需要传输到设备图像 vkCmdCopyBufferToImage用于它 对于设备图像的格式 我看到两个选项 使用 R32G32B32A32 SFLOAT R8G8B8A8 SNORM 并将
  • 如何测量Vulkan管道的执行时间

    Summary 我希望能够测量 GPU 上运行整个图形管道所花费的时间 以毫秒为单位 目标 能够在优化代码之前 之后保存基准 下一步将是 mipmap 纹理 以查看改进 这在 OpenGL 中非常简单 但我是 Vulkan 新手 需要一些帮
  • vulkan 扩展:哪些由谁支持?

    有EXT KHR or AMD or NV扩展 也许还有其他一些 我知道NV means NvidiaAMD 不太可能支持 it nv 扩展 但是 khr 或 ext 又如何呢 他们是所有人都强制支持的吗 有一个website https

随机推荐