微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 SPIRV-Reflect,我怎么知道来自不同着色器的两个描述符绑定实际上是指同一个缓冲区?

如何解决使用 SPIRV-Reflect,我怎么知道来自不同着色器的两个描述符绑定实际上是指同一个缓冲区?

我有一个用 HLSL 编写的顶点和片段着色器,我使用 DirectX Shader Compiler 将它们编译成 SPIR-V 二进制文件

它们都使用一个共同的 cbuffer(我想把它当作一个 uniform 缓冲区)ubo。为了构造一个合适的VkDescriptorSetLayout,我想使用SPIRV-Reflect获取关于ubo的必要信息。

虽然我可以从着色器的 SPIR-V 二进制文件的二进制文件中创建单独的 spv_reflect::ShaderModulevertex_shaderfragment_shader,但我只能检索有关现有描述符绑定的信息通过在两个EnumerateDescriptorBindings()单独调用spv_reflect::ShaderModule

它们都产生ubo的存在。但我想要做的是告诉 API 两个着色器使用相同的统一缓冲区 ubo,即为 VkDescriptorSetLayoutBinding 创建一个 ubo 并指定 VK_SHADER_STAGE_VERTEX_BIT 和 {{1 }} 用于 VK_SHADER_STAGE_FRAGMENT_BIT 字段。

但为了做到这一点,我需要检测对 stageFlags 的各个调用所产生的两个描述符绑定都指的是同一个缓冲区。我该怎么做?

解决方法

我不知道 HLSL 如何处理资源绑定,但大概它有某种机制来指定给定资源如何与 D3D12 的资源模型相关联。据推测,您用来生成 SPIR-V 的编译器要么将 D3D12 资源模型映射到 Vulkan 描述符集/绑定模型,要么对 HLSL 语言本身进行修改以允许用户为资源指定 Vulkan 描述符集/绑定。

无论哪种方式,此进程生成的 SPIR-V 必须为它使用的每个描述符资源设置一个描述符集和一个绑定索引。

如果 VS 和 FS 都使用相同的 UBO,那么这意味着它们必须被编写为对该 UBO 使用相同的 set+binding。因此,当您反射多个 SPIR-V 模块以聚合它们使用的资源时,您将需要通过 set+binding 聚合这些资源。如果两个模块声明了一个具有相同集合和绑定的资源,那么它们在布局中就是同一个资源。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。