1

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

它们都使用一个 common cbuffer(我想将其视为uniform缓冲区)ubo。为了构造一个合适的VkDescriptorSetLayout,我想使用SPIRV-Reflect来获取关于ubo.

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

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

但为了做到这一点,我需要检测到各个调用产生的两个描述符绑定EnumerateDescriptorBindings都引用同一个缓冲区。我怎样才能做到这一点?

4

1 回答 1

1

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

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

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

于 2021-01-15T17:15:08.453 回答