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 的相关文章

  • 在Android Studio中使用vulkan

    首先要确定手机是否支持Vulkan 可以下载一个aida64 在设备中如果能找到vulkan设备 说明支持 否则不支持 严格按照官方介绍的步骤一步步执行 就能获得官方推荐的可执行的例子 有很多 可以都试一试 那怎么在自己的工程中使用vulk
  • 支持Vulkan的移动GPU

    去年差不多这个时候 Vulkan标准发布 NVIDIA和AMD随之发布了显卡的Vulkan驱动 虽然都是实验版本 但是毕竟能够工作的 Intel的速度就慢了不少 时隔一年 Intel终于推出了Vulkan认证的驱动 虽然之前就有了实验性质的
  • Vulkan入门(一)-环境配置.md

    文章目录 参考资料 简述 一 准备环境 1 1 开发环境 1 2 下载 SDK 1 3 安装SDK 1 4 安装驱动 1 5 运行示例程序 二 GLFW 安装 三 GLM 安装 四 手动编译示例代码 4 1 在编译示例代码的时候老是报错 找
  • Vulkan同步机制和图形-计算-图形转换的风险(一)

    在现代渲染环境中 很多情况下在一个数据帧期间会产生计算负荷 在GPU上计算通常 非固定功能 是并行编程的 通常用于具有挑战性 完全不可能或仅通过标准图形管道 顶点 几何 细化 栅格 碎片 实现的效率低下的技术 一般情况下 计算在实现技术方面
  • Vulkan 绘制显示设计

    背景 众所周知 Vulkan是个跨平台的图形渲染API 为了友好地支持跨平台 Vulkan自然也抽象出了很多接口层去对接各个操作系统 抹平系统间的差异 Swap Chains即为WSI 其本质上是一种图像队列 此队列会按顺序依次将队列中的若
  • 无论如何,是否有将 VkDescriptorImageInfo 设置为 null 或有某种方式跳过使用 VkWriteDescriptorSet 而不会出现 vulkan 抱怨

    我将使用的一些网格并不总是具有 DiffuseMap 或 SpecularMap 当我尝试加载没有漫反射和镜面反射贴图的内容时 程序崩溃 因为 DiffuseMap ImageView SpecularMap ImageView 中没有任何
  • Vulkan 的 VkAllocationCallbacks 使用 malloc/free() 实现

    我正在阅读Vulkan 内存分配 内存主机似乎 VkAllocationCallbacks 可以使用简单的 malloc realloc free 函数来实现 typedef struct VkAllocationCallbacks voi
  • 我可以将 R8G8B8A8 放入 UBO 中,并将其用作 vec4 吗?

    我尝试优化工作计算着色器 它的目的是创建一个图像 找到合适的颜色 使用一个小调色板 然后调用imageStore image ivec2 vec4 颜色在 UniformBuffer 的 uint 数组中进行索引 该 UBO 中的一种颜色封
  • Wat 执行“vkCreateSwapchainKHR:内部可绘制对象创建失败”。方法

    我总是卡在交换链的创建上 我不知道为什么 我启用了验证层 我得到的最好的答案是 vkCreateSwapchainKHR 内部绘图创建失败 我有一张 Nvidia GTX960 卡 我在它上面运行了一些 vulkan 样本 所以它必须支持
  • 如何使 VK_LAYER_KHRONOS_validation 可用?

    解决方案 卸载 vulkan 在注册表 HKLM SOFTWARE Khronos Vulkan ExplicitLayers 和 HKLM SOFTWARE WOW6432Node Khronos Vulkan ExplicitLayer
  • 如何将 Vulkan 与 MinGW 结合使用? (R_X86_64_32 错误)

    我正在尝试设置一个简单的程序来使用 Vulkan 我安装了 LunarG SDK 我有一个小程序 基本上只是调用vkCreateInstance 我用这一行编译 g std c 11 I c VulkanSDK 1 0 3 1 Includ
  • Vulkan 验证层无法在 Linux 上加载/工作

    我有基本的 Vulkan 应用程序 Hello Triangle 源自本教程 https vulkan tutorial com 在调试模式下 我使用两个验证层 VK LAYER KHRONOS validation and VK LAYE
  • Vulkan 内存对齐要求

    我正在为 Vulkan 设备内存实现一个简单的内存管理器 并希望确保我了解内存的对齐要求以及如何满足这些要求 因此 假设我使用 vkAllocateMemory 分配了一个内存 池 并希望将该池中的内存块子分配给各个资源 基于 VkMemo
  • Vulkan 管道顶部/底部和 ALL_COMMANDS

    作为很多 初学者 我认为使用 TOP OF PIPELINE 作为 dst 和 BOTTOM OF PIPELINE 作为 src 意味着两者的 ALL COMMANDS Here https github com KhronosGroup
  • Vulkan:在多个命令缓冲区中排序图像内存屏障

    对于资源转换 您需要了解 之前 和 之后 VkImageLayout资源的 例如 在VkImageMemoryBarrier传递给vkCmdPipelineBarrier Vulkan 不保证命令缓冲区执行的任何顺序 除非 API 文档中明
  • vulkan 扩展:哪些由谁支持?

    有EXT KHR or AMD or NV扩展 也许还有其他一些 我知道NV means NvidiaAMD 不太可能支持 it nv 扩展 但是 khr 或 ext 又如何呢 他们是所有人都强制支持的吗 有一个website https
  • 如何在 C++ 项目的 Cmake 文件上添加 Mac OS 框架

    我正在尝试将外部库 Vulkan 添加到我的项目中 这个库是预编译的并且有一个框架 我的项目树 build source Entry main cpp include ext vulkan macos include lib Framewo
  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • 在 vulkan 中同步顶点缓冲区?

    我有一个顶点缓冲区 存储在设备内存和缓冲区中 并且主机可见且主机一致 为了写入主机端的顶点缓冲区 我将其映射 memcpy 到它并取消映射设备内存 为了从中读取数据 我在记录渲染过程期间将顶点缓冲区绑定在命令缓冲区中 这些命令缓冲区在获取
  • 子组调用索引是否映射到 gl_LocalInitationIndex?

    我需要计算吗gl SubgroupID gl SubgroupSize gl SubgroupInvocationID 或者我可以使用gl LocalInvocationIndex 单个子组内的调用是否连续gl SubgroupInvoca

随机推荐