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

Roe*_*art 3 c++ opengl uniform opengl-4 ssbo

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

是否可以在绑定着色器之前绑定所有 ubos 和 ssbo,只要着色器使用的每种类型缓冲区的数量 <= OpenGL 允许同时在着色器中使用的最大数量?

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

Nic*_*las 5

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

此外,对于缓冲区支持的接口块,有一个实现定义的可由各个着色器阶段使用的最大块数。请注意,这些最大值是为每个着色器阶段单独指定的。一次渲染操作中可以使用的总数通常是(但不要求是)每个着色器阶段中可以使用的数量的总和。

对于 UBO,每级数量必须至少为 14,合并计数必须为 14 * 6(每个着色器阶段一个)。某些硬件支持 15,但没有硬件支持更多。

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

SSBO 绑定点的数量有更多变化。但即便如此,它的最大绑定数也为 64。

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