Glsl Vulkan中均匀缓冲区中的动态大小数组

Glsl Vulkan中均匀缓冲区中的动态大小数组,glsl,vulkan,Glsl,Vulkan,我最近重新编写了一些代码来使用OpenGL中的着色器存储缓冲区对象,将动态大小的数组发送到GLSL中,从而在绘制许多程序生成的对象时大大提高了性能 我得到的是几千点,对于每一点,我都会渲染一个程序生成的圆形广告牌。每个特征可以依次具有不同的颜色和半径,以及一些其他特征(表示为布尔或枚举) 我用这些位置填充一个向量,再加上半径和颜色。然后我上传它作为一个动态大小的着色器存储缓冲区对象。我创建了一个包含0个VBO的虚拟VAO,但调用了具有相同数量点的draw命令。 在着色器内部,然后使用gl_Ver

我最近重新编写了一些代码来使用OpenGL中的着色器存储缓冲区对象,将动态大小的数组发送到GLSL中,从而在绘制许多程序生成的对象时大大提高了性能

我得到的是几千点,对于每一点,我都会渲染一个程序生成的圆形广告牌。每个特征可以依次具有不同的颜色和半径,以及一些其他特征(表示为布尔或枚举)

我用这些位置填充一个向量,再加上半径和颜色。然后我上传它作为一个动态大小的着色器存储缓冲区对象。我创建了一个包含0个VBO的虚拟VAO,但调用了具有相同数量点的draw命令。 在着色器内部,然后使用gl_VertexID遍历该数组,并为每个点生成一个带有纹理坐标的四边形(两个三角形)

我正在寻找一种在Vulkan做同样事情的方法。在Vulkan中是否有方法将动态大小的数组传递到着色器中?在阅读Graham Seller的Vulkan书中有关着色器存储缓冲区对象的内容时,只提到它们是读写的,但不能动态调整数组大小


编辑:根据Sasha Willems粒子示例,看起来存储缓冲区实际上能够处理动态大小的数组。有没有办法通过制服做同样的事情?

我可能误解了你的问题。SSBO在两个API之间具有相同的行为和功能。这就是为什么它们的名字是一样的。存储块末尾的无界数组将在运行时根据您提供的数据定义其长度

缓冲区描述符的大小没有硬编码到描述符集布局中;这是您使用
VkWriteDescriptorSet
设置的内容。现在,与偏移量不同,在不更改描述符本身的情况下,无法更改描述符集的大小。也就是说,您没有与
vkCmdBindDescriptorSets
pdynamicsoffsets
字段等价的字段。因此,您必须在现场实际更新描述符以更改长度

但这只需要双缓冲描述符集;这不应该是个问题

有没有办法通过制服做同样的事情


同样,Vulkan的答案与OpenGL的答案相同:否。

听起来您可以使用tesselation、Instance或几何体着色器来获得相同的效果,并将每公告牌数据放在顶点属性中。@ratchetfreak:谢谢,它们都是解决同一问题的三种不同可能性。我还使用几何体着色器和顶点属性实现了它(但仍然在顶点着色器中生成三角形),它们都是有趣的实现方法!不过,我对使用几何体着色器有点犹豫,因为你看到很多人抱怨他们的性能不足。尼科尔,我想这回答了我的问题!当然,你完全正确,SSBO是相同的,我误解了卖方书中的描述,因为他没有特别提到使用无界数组(作为存储块的最后一个成员)的奇妙能力。