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

OpenGL计算着色器:为什么可以';我不能绑定超过16个SSBO吗?,opengl,graphics,glsl,linker-errors,compute-shader,Opengl,Graphics,Glsl,Linker Errors,Compute Shader,我在我的计算着色器中进行第17次SSBO声明,我收到一个链接时间错误 C5058: no buffers available for bindable storage buffer 我使用的是GTX 1070,GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS=96,我似乎不明白为什么它不允许我声明和绑定超过16个SSBO。我一直在寻找是否需要一个扩展,但除了一个关于QT的老的、没有答案的、看起来不相关的线索之外,似乎什么也找不到 我在GTX 1070上,有GL\u M

我在我的计算着色器中进行第17次SSBO声明,我收到一个链接时间错误

C5058: no buffers available for bindable storage buffer
我使用的是GTX 1070,GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS=96,我似乎不明白为什么它不允许我声明和绑定超过16个SSBO。我一直在寻找是否需要一个扩展,但除了一个关于QT的老的、没有答案的、看起来不相关的线索之外,似乎什么也找不到

我在GTX 1070上,有
GL\u MAX\u SHADER\u STORAGE\u BUFFER\u绑定
=96, 我似乎不明白为什么它不让我申报 绑定超过16个SSBO

因为这不是正确的限制
GL\u MAX\u SHADER\u STORAGE\u BUFFER\u BINDINGS
只是对OpenGL状态下可同时绑定的不同SSBO总数的限制,但对每个着色器阶段可访问的SSBO块的实际数量有限制(此处使用当前GL 4.6规范中的最小值):

  • 最大顶点着色器存储块
    ,保证最小值:0
  • MAX\u TESS\u CONTROL\u SHADER\u STORAGE\u块
    ,保证最小值:0
  • MAX\u TESS\u EVALUATION\u SHADER\u STORAGE\u块
    ,保证最小值:0
  • MAX\u GEOMETRY\u SHADER\u STORAGE\u块
    ,保证最小值:0
  • MAX\u FRAGMENT\u SHADER\u STORAGE\u块
    ,保证最小值:8
  • MAX\u COMPUTE\u SHADER\u STORAGE\u块
    ,保证最小值:8

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

您不会碰巧知道有任何资源可以查看卡分发的限制?我正在做一个游戏,8个缓冲区对于这个着色器来说太少了。我只想勉强过一下,拿出一个,把我带回到16岁,所以我想知道是否有办法告诉我允许16岁是多么独特或普通。@gdevi@gdevi你当然可以想出一种方法,将其中一些结合起来。@user253751当然,在某个点上是一样的,对吧?我可以将我的一些ivecN数组缩减为整数,将它们全部合并为一个整数[],并为各个偏移量+长度传递一致性。这一切似乎都是不必要的复杂,我只是对GPU硬件架构不够熟悉,无法理解为什么缓冲区绑定位置会有限制,更不用说这么低了。