在 Vulkan 中使用 HLSL 着色器时 Buffer<float4> 的正确描述符类型是什么?

What is the correct descriptor type for Buffer<float4> when using an HLSL shader in Vulkan?

我正在尝试在我的 Vulkan 渲染器中使用 HLSL 片段着色器。着色器读取缓冲区:

layout(set=0, binding=3) Buffer<float4> pointLightBufferCenterAndRadius : register(t1);

我不知道应该为那个描述符槽使用哪种描述符。我尝试使用 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER 但验证层给我以下错误:

Type mismatch on descriptor slot 0.3 (used as type ptr to const uniform image(dim=5, sampled=1)) but descriptor of type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER

Buffer<float4> 的正确描述符类型是什么?

快速谷歌搜索后,Buffer type in HLSL 似乎代表 OpenGL 所称的 "buffer texture" 和 Vulkan 所称的 "texel buffer"。也就是说,一个缓冲区被解释为特定格式的 "pixels" 的一维数组(因此是 <float4> 部分)。

编译器正在生成符合此描述的 SPIR-V:uniform 变量,其类型由 OpTypeImage 创建,维度为 Buffer(因此,the "dim=5" 部分错误)。这样的变量预期用于 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER 类型的描述符。您需要将 VkBufferView 绑定到此描述符,并且该视图的 VkBuffer 源必须允许 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT 用法。

当然 VkBuffer 的内存支持必须允许这样的使用。