Vulkan 统一缓冲区中的动态大小数组
Dynamic size arrays in Uniform buffer in Vulkan
我最近重新编写了一些代码以在 OpenGL 中使用着色器存储缓冲区对象,将动态大小的数组发送到 GLSL,在绘制许多程序生成的对象时大大提高了性能。
我有几千个点,我为每个点渲染一个程序生成的圆形广告牌。每一个又可以有不同的颜色和半径,以及一些其他特征(表示为布尔值或枚举)
我用这些位置填充一个矢量,并与半径和颜色一起打包。然后我将其作为具有动态大小的着色器存储缓冲区对象上传。我创建了一个虚拟 VAO,其中包含 0 个 vbos,但使用与我拥有的相同数量的点调用绘图命令。
在着色器内部,然后我使用 gl_VertexID 遍历此数组,并为每个点生成一个带有纹理坐标的四边形(两个三角形)。
我正在寻找一种在 Vulkan 中执行相同操作的方法。 Vulkan 中有什么方法可以将动态大小的数组传递给着色器吗?在 Graham Seller 的 Vulkan 书中阅读有关 Shader Storage Buffer 对象的内容,它只提到它们是可读写的,但不能动态调整大小的数组。
编辑:根据 Sasha Willems 粒子示例,似乎存储缓冲区 是 实际上能够动态调整大小的数组。有没有办法通过制服做同样的事情?
我可能误解了你的问题。 SSBO 在两个 API 之间具有相同的行为和功能。这就是为什么它们 被命名为相同 的原因。存储块末尾的无界数组将根据您提供的数据在运行时定义其长度。
缓冲区描述符的大小未硬编码到描述符集布局中;这是你用 VkWriteDescriptorSet
设置的东西。现在与偏移量不同,您不能在不更改描述符本身的情况下更改描述符集的大小。也就是说,您没有相当于 vkCmdBindDescriptorSets
的 pDynamicOffsets
字段。所以你必须实际更新描述符来改变长度。
但这只需要双缓冲您的描述符集;应该不是问题。
Is there a way of doing the same thing via uniforms?
同样,对于 Vulkan 和 OpenGL 的答案是一样的:不。
我最近重新编写了一些代码以在 OpenGL 中使用着色器存储缓冲区对象,将动态大小的数组发送到 GLSL,在绘制许多程序生成的对象时大大提高了性能。
我有几千个点,我为每个点渲染一个程序生成的圆形广告牌。每一个又可以有不同的颜色和半径,以及一些其他特征(表示为布尔值或枚举)
我用这些位置填充一个矢量,并与半径和颜色一起打包。然后我将其作为具有动态大小的着色器存储缓冲区对象上传。我创建了一个虚拟 VAO,其中包含 0 个 vbos,但使用与我拥有的相同数量的点调用绘图命令。 在着色器内部,然后我使用 gl_VertexID 遍历此数组,并为每个点生成一个带有纹理坐标的四边形(两个三角形)。
我正在寻找一种在 Vulkan 中执行相同操作的方法。 Vulkan 中有什么方法可以将动态大小的数组传递给着色器吗?在 Graham Seller 的 Vulkan 书中阅读有关 Shader Storage Buffer 对象的内容,它只提到它们是可读写的,但不能动态调整大小的数组。
编辑:根据 Sasha Willems 粒子示例,似乎存储缓冲区 是 实际上能够动态调整大小的数组。有没有办法通过制服做同样的事情?
我可能误解了你的问题。 SSBO 在两个 API 之间具有相同的行为和功能。这就是为什么它们 被命名为相同 的原因。存储块末尾的无界数组将根据您提供的数据在运行时定义其长度。
缓冲区描述符的大小未硬编码到描述符集布局中;这是你用 VkWriteDescriptorSet
设置的东西。现在与偏移量不同,您不能在不更改描述符本身的情况下更改描述符集的大小。也就是说,您没有相当于 vkCmdBindDescriptorSets
的 pDynamicOffsets
字段。所以你必须实际更新描述符来改变长度。
但这只需要双缓冲您的描述符集;应该不是问题。
Is there a way of doing the same thing via uniforms?
同样,对于 Vulkan 和 OpenGL 的答案是一样的:不。