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

问题描述

在着色器中指定“ location = x”以指定着色器存储或统一缓冲区绑定点时,该数字可以为任何值吗?此绑定点是否与当前绑定的着色器无关?

只要绑定着色器使用的每种类型的缓冲区的数量

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

解决方法

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

此外,对于buffer-backed interface blocks,存在各种着色器阶段可以使用的实现定义的最大块数。请注意,为每个着色器阶段分别指定了这些最大值。渲染操作中可以使用的总数通常(但不是必须)是每个着色器阶段可以使用的总数。

对于UBO,每个阶段的数量必须至少为14,而总数量则必须为14 * 6(每个着色器阶段一个)。 Some hardware supports 15,但没有其他硬件支持。

对于SSBO,每个阶段的数量仅需要为8,即使这样,也仅需要片段和计算着色器具有 any 这样的绑定点。也就是说,一个实现可以支持SSBO,但是并不需要在每个阶段都支持它们。只是片段和计算阶段。

SSBO绑定点的数量为more variation。但即使在那儿,它最多可以绑定64个。

因此,除非缓冲区的数量很小,否则无法绑定所有内容并让着色器选择。那样很好,因为绑定缓冲区的成本通常小于更改 shaders 的成本。更改缓冲区比更改着色器更好。