在Vulkan中使用HLSL着色器时,Buffer 的正确描述符类型是什么?
问题描述:
我想在我的Vulkan渲染器中使用HLSL片段着色器。着色器读取缓冲区:在Vulkan中使用HLSL着色器时,Buffer <float4>的正确描述符类型是什么?
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称之为“缓冲纹理”和Vulkan称之为“纹理缓冲区”的东西。也就是说,缓冲区被解释为特定格式的“像素”的1D阵列(因此是<float4>
部分)。
编译器产生,该描述相符SPIR-V:与由OpTypeImage
创建的类型uniform
可变的,Buffer
(因此,the "dim=5"误差的一部分)的尺寸。这样的变量预计将用于VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
类型的描述符。您需要将VkBufferView
绑定到此描述符,并且该视图的源必须允许使用VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
。
当然,内存支持VkBuffer
必须允许这种用法。