GLSL:如何正确绑定数千个缓冲区?

时间:2014-05-15 02:25:51

标签: opengl binding buffer glsl indexed

我提出了一个想法,需要将数千个缓冲区(原子计数器和Shader存储器)绑定到一个GLSL程序。我首先检查了这是否对openGL的限制有任何意义,似乎有两个原因:

  1. 在我的笔记本电脑上GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS和GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS都在32k左右。所以openGL被封装起来让我一次性绑定数千个缓冲区。
  2. openGL 4.4提出:

    void BindBuffersBase(enum target,uint first,sizei count,const uint * buffers);

  3. 在C代码上看起来很容易,但我不清楚如何做我的着色器。绑定索引缓冲区时,我们应该使用:

    layout (std430, binding = 0) buffer Objects
    {
      Object objects[];
    };
    

    绑定几个缓冲区时可以。但就我而言:

    1. 我事先并不知道将绑定多少缓冲区
    2. 即使我知道,我是否应该为EACH缓冲区编写一些代码行并在布局绑定中定义0,1,2,...,n?
    3. 问题是: 有没有办法让着色器不知道将绑定到它的缓冲区数量?假设它们都包含相同类型的数据。

      答案:

      感谢Andon M. Coleman快速而明确的答案。

      首先,我认为我的硬件支持数以千计的绑定是错误的。新手错误,我采用了定义的值而不是运行时的值。

      在我的机器上:

      1. GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
      2. GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
      3. GL_MAX_UNIFORM_BUFFER_BINDINGS = 84
      4. 这与我提出的问题相去甚远。

        但是,在着色器中定义多个缓冲区是有意义的:

        A
        {
          B b[];
        }
        layout (std430, binding = 0) buffer A a[32];
        

        必须事先知道最大绑定量,但这些缓冲区将占用从0到31的绑定。

1 个答案:

答案 0 :(得分:1)

感谢Andon M. Coleman快速而明确的答案。

首先,我认为我的硬件支持数以千计的绑定是错误的。新手错误,我采用了定义的值而不是运行时的值。

在我的机器上:

  1. GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
  2. GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
  3. GL_MAX_UNIFORM_BUFFER_BINDINGS = 84
  4. 这与我提出的问题相去甚远。

    但是,在着色器中定义多个缓冲区是有意义的:

    A
    {
      B b[];
    }
    layout (std430, binding = 0) buffer A a[32];
    

    必须事先知道最大绑定量,但这些缓冲区将占用从0到31的绑定。