当您在着色器中指定“location = x”以指定着色器存储或统一缓冲区绑定点时,该数字可以是任何值吗?这个绑定点是否独立于当前绑定的着色器?
是否可以在绑定着色器之前绑定我的所有 ubos 和 ssbos,只要着色器使用的每种类型的缓冲区的数量 <= OpenGL 允许一次在着色器中使用的最大值?
我可以绑定 20 个缓冲区,然后通过在着色器中指定绑定点索引来指定着色器当前正在使用哪些缓冲区吗?
每个索引缓冲区绑定点(以及 OpenGL 中几乎所有类型的绑定)都有一个实现定义的最大可用绑定索引数。这表示在任何一次渲染操作期间硬件可以以这种方式使用的缓冲区的最大数量。
此外,对于缓冲区支持的接口块,有一个实现定义的最大块数,可供各种着色器阶段使用。请注意,这些最大值是为每个着色器阶段单独指定的。可以在渲染操作中使用的总数通常是(但不必须是)每个着色器阶段中可以使用的数量的总和。
对于 UBO,每个阶段的数量要求至少为 14,组合计数要求为 14 * 6(每个着色器阶段一个)。一些硬件支持 15,但没有硬件支持更多。
对于 SSBO,每个阶段的数量只需要 8 个,即使这样,也只需要片段和计算着色器有任何这样的绑定点。也就是说,一个实现可以支持 SSBO,但不需要在每个阶段都支持它们;只是片段和计算阶段。
SSBO 绑定点的数量有更多变化。但即使在那里,它也最多可以绑定 64 个绑定。
因此,除非缓冲区的数量非常少,否则无法绑定所有内容并让着色器选择。这很好,因为绑定缓冲区的成本通常低于更改着色器的成本。更改缓冲区比更改着色器要好。