我想出了一个想法,需要将数千个缓冲区(原子计数器和着色器存储缓冲区)绑定到一个 GLSL 程序。我首先检查了这是否对 openGL 的限制有意义,这似乎有两个原因:
- 在我的笔记本电脑上,GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 和 GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 都在 32k 左右。所以openGL倾向于让我一次绑定数千个缓冲区。
openGL 4.4 提出:
void BindBuffersBase(enum target, uint first, sizei count, const uint *buffers);
在 C 代码上看起来很容易,但我不知道如何做我的着色器。当绑定索引缓冲区时,我们应该使用:
layout (std430, binding = 0) buffer Objects
{
Object objects[];
};
绑定几个缓冲区时就可以了。但就我而言:
- 我事先不知道会绑定多少个缓冲区
- 即使我知道,我是否应该为每个缓冲区编写一些代码行并在布局绑定中定义 0, 1, 2, ..., n ?
那么问题来了:有没有办法让着色器不知道绑定到它的缓冲区的数量?假设它们都包含相同类型的数据。
回答 :
感谢Andon M. Coleman提供快速而清晰的答案。
首先,我错误地认为我的硬件支持数千个绑定。菜鸟错误,我取的是定义的值而不是运行时的值。
在我的机器上:
- GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 96
- GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 8
- GL_MAX_UNIFORM_BUFFER_BINDINGS = 84
这与我提出问题的依据相去甚远。
但是,在着色器中定义多个缓冲区是一种方法:
A
{
B b[];
}
layout (std430, binding = 0) buffer A a[32];
必须提前知道最大绑定的数量,但这些缓冲区将占用从 0 到 31 的绑定。