SSBO 绑定点索引可以是任何值吗?

Can an SSBO binding point index be any value?

当您在着色器中指定“location = x”以指定着色器存储或统一缓冲区绑定点时,该数字可以是任何值吗?这个绑定点是否独立于当前绑定的着色器?

是否可以在绑定我的着色器之前绑定我所有的 ubos 和 ssbos,只要着色器使用的每种缓冲区的数量 <= OpenGL 允许一次在着色器中使用的最大值?

我可以绑定 20 个缓冲区,然后通过在着色器中指定绑定点索引来指定着色器当前正在使用哪些缓冲区吗?

每个 indexed buffer binding point(以及 OpenGL 中几乎所有类型的绑定)都有一个 implementation-defined 可用绑定索引的最大数量。这表示硬件在任何一次渲染操作期间可以以这种方式使用的最大缓冲区数。

此外,对于 buffer-backed interface blocks,各个着色器阶段可以使用的最大块数为 implementation-defined。请注意,这些最大值是为每个着色器阶段单独指定的。一个渲染操作中可以使用的总数一般(但不是必须)是每个着色器阶段可以使用的数量的总和。

对于 UBO,per-stage 数量必须至少为 14,组合计数必须为 14 * 6(每个着色器阶段一个)。 Some hardware supports 15,但没有硬件支持更多。

对于SSBO,per-stage数量只需要8,即便如此,也只有片段和计算着色器需要有any这样的绑定点在全部。也就是说,一个实现可以支持 SSBO,但不需要在每个阶段都支持它们;只是片段和计算阶段。

SSBO绑定点数有more variation个。但即使在那里,它最多也有 64 个绑定。

所以除非缓冲区的数量非常少,否则没有办法只绑定所有内容并让着色器选择。这很好,因为绑定缓冲区的成本通常低于更改 着色器 的成本。更改缓冲区比更改着色器更好。