1

我想出了一个想法,需要将数千个缓冲区(原子计数器和着色器存储缓冲区)绑定到一个 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);

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

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

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

  1. 我事先不知道会绑定多少个缓冲区
  2. 即使我知道,我是否应该为每个缓冲区编写一些代码行并在布局绑定中定义 0, 1, 2, ..., n ?

那么问题来了:有没有办法让着色器不知道绑定到它的缓冲区的数量?假设它们都包含相同类型的数据。

回答 :

感谢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

这与我提出问题的依据相去甚远。

但是,在着色器中定义多个缓冲区是一种方法:

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

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

4

1 回答 1

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

这与我提出问题的依据相去甚远。

但是,在着色器中定义多个缓冲区是一种方法:

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

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

于 2014-05-15T16:11:07.907 回答