GLSL:如何正确地绑定成千上万的缓冲区?(GLSL : How to bind thousands

2019-10-20 03:01发布

我想出了一个需要成千上万的缓冲区(原子柜台和Shader存储的)绑定到一个GLSL程序的想法。 我第一次检查,如果这会使得在OpenGL的限制任何意义,它似乎可能有两个原因:

  1. 在我的笔记本电脑GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS和GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS都是32K左右。 因此,OpenGL是enclined让我绑定数千缓冲区一通。
  2. openGL的4.4自带了:

    空隙BindBuffersBase(枚举目标,UINT第一,sizei计数,常量UINT *缓冲器);

在C代码似乎很容易,但我对如何做我的着色器没有任何线索。 当绑定索引缓冲区,我们应该使用:

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

当绑定几个缓冲区它是确定。 但在我的情况:

  1. 我不知道提前多少缓冲区将被绑定
  2. 即使我知道,我应该写为每个缓冲区的一些代码行,并在布局结合0,1,2,...,N定义?

接下来的问题是:有没有一种方法,使着色器不知道将被绑定到缓冲区的数目? 假定它们都包含相同类型的数据。

答:

由于安东M.科尔曼的快速和清晰的答案。

首先,我是一个错误的假设我的硬件支持数以千计的绑定。 新秀的错误,我把所定义的值,而不是运行时的一个。

在我的机器:

  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。

Answer 1:

由于安东M.科尔曼的快速和清晰的答案。

首先,我是一个错误的假设我的硬件支持数以千计的绑定。 新秀的错误,我把所定义的值,而不是运行时的一个。

在我的机器:

  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。



文章来源: GLSL : How to bind thousands of buffers properly?