OpenGL 计算着色器:为什么我不能绑定超过 16 个 SSBO?

OpenGL compute shader: Why can't I bind more than 16 SSBOs?

我正在我的计算着色器中进行第 17 次 SSBO 声明,我收到了 link 次错误,

C5058: no buffers available for bindable storage buffer

我在 GTX 1070 上,GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96,我似乎无法弄清楚为什么它不允许我声明和绑定超过 16 个 SSBO。我一直在寻找是否需要扩展,但似乎找不到任何东西,除了一个关于 QT 的旧的、未回答的、看似无关的线程。

I'm on a GTX 1070, with GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96, and I can't seem to figure out why it isn't letting me declare and bind more than 16 SSBOs.

因为那不是正确的限制。 GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 只是您在 OpenGL 状态下可以同时绑定的不同 SSBO 总数的限制,但是每个可以访问的 SSBO 块的实际数量有限制 着色器阶段(此处使用当前 GL 4.6 规范中的最小值):

  • MAX_VERTEX_SHADER_STORAGE_BLOCKS,保证最小值:0
  • MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS,保证最小值:0
  • MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS,保证最小值:0
  • MAX_GEOMETRY_SHADER_STORAGE_BLOCKS,保证最小值:0
  • MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,保证最小值:8
  • MAX_COMPUTE_SHADER_STORAGE_BLOCKS,保证最小值:8

因此,通过在您的计算着色器中使用超过 8 个 SSBO,您已经超出了符合 GL 4.6 实现所要求提供的范围,如果超过 16 个,您就超出了您的特定 GL 实现所提供的范围,因为 NVIDIA 当前的驱动程序似乎支持每个状态 16 个 SSBO,并且它们允许您同时绑定那么多不同的 SSBO (6*16=96)。