如何获得自动唯一的原子计数器绑定点(没有硬编码绑定=)?

时间:2014-12-03 09:55:22

标签: opengl glsl modularity hardcoded

许多文章通过指定固定的绑定点来描述使用原子计数器:

//Shader:
layout(binding = 0, offset = 0) uniform atomic_uint myAtomicCounter;

//App code
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, myBufferHandle);

这里,在着色器和应用程序代码中都指定了硬编码绑定点binding = 0。我想这些文章是这样做的,因为,

  

未为原子计数器分配位置,可能不是   使用Uniform*命令修改。绑定,   偏移和属于原子计数器的步幅   程序对象的无效和新的   每次成功重新链接后分配。 [shader_atomic_counters]

上述情况很好,直到您需要更多模块化着色器代码。例如,我有两个着色器包含文件,每个文件都需要一个原子计数器,我已经将其编写为可插入的代码,而这些代码对另一个并不了解。显然,我不想指定硬编码绑定点,我希望应用程序自动处理它。我不太关心他们使用哪些绑定点,只是他们不是一样的。

顶点着色器属性显示类似。我可以在着色器链接之前在运行时强制绑定位置(glBindAttribLocation),或者让OpenGL为我选择它们,然后查询结果(glGetAttribLocation)。我还可以搜索所有属性(glGetActiveAttrib)。

如何为原子计数器实现自动唯一绑定点,因此它们不是硬编码的,我可以混合着色器代码?

我可以看到一些可能的方法,但仍然存在链接后不更改它们的限制:

  1. 不要在着色器中指定绑定点,让OpenGL在链接时选择一个。我不知道OpenGL是否会这样做。如果是,如何查询以查找使用的绑定点?
  2. 在链接之前查询着色器对象以查找原子计数器。然后为属性提供与glBindAttribLocation类似的唯一绑定位置。 是否有分配绑定点的机制?
  3. 解析所有着色器代码,查找原子计数器并使用着色器代码本身中的唯一索引替换绑定点,可能使用#define宏。万不得已。我真的不想这样做。

2 个答案:

答案 0 :(得分:1)

第1点:原子计数器的binding布局参数不是可选的

第2点:由于binding不是可选的,因此无法从OpenGL代码设置它。

所以你唯一的办法是#3。

答案 1 :(得分:0)

您可以使用glGetActiveUniform查询原子计数器。然后获取缓冲区索引,最后得到绑定点:

int atomicCounterIndex;
glGetActiveUniformsiv(programId, count, index, 
        GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX, &atomicCounterIndex);
glGetActiveAtomicCounterBufferiv(programId, atomicCounterIndex, 
        GL_ATOMIC_COUNTER_BUFFER_BINDING, &myBufferHandle)

这符合OpenGL 4.2规定的in the docs