我想出了一个需要成千上万的缓冲区(原子柜台和Shader存储的)绑定到一个GLSL程序的想法。 我第一次检查,如果这会使得在OpenGL的限制任何意义,它似乎可能有两个原因:
- 在我的笔记本电脑GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS和GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS都是32K左右。 因此,OpenGL是enclined让我绑定数千缓冲区一通。
openGL的4.4自带了:
空隙BindBuffersBase(枚举目标,UINT第一,sizei计数,常量UINT *缓冲器);
在C代码似乎很容易,但我对如何做我的着色器没有任何线索。 当绑定索引缓冲区,我们应该使用:
layout (std430, binding = 0) buffer Objects
{
Object objects[];
};
当绑定几个缓冲区它是确定。 但在我的情况:
- 我不知道提前多少缓冲区将被绑定
- 即使我知道,我应该写为每个缓冲区的一些代码行,并在布局结合0,1,2,...,N定义?
接下来的问题是:有没有一种方法,使着色器不知道将被绑定到缓冲区的数目? 假定它们都包含相同类型的数据。
答:
由于安东M.科尔曼的快速和清晰的答案。
首先,我是一个错误的假设我的硬件支持数以千计的绑定。 新秀的错误,我把所定义的值,而不是运行时的一个。
在我的机器:
- 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。