许多文章通过指定固定的绑定点来描述使用原子计数器:
//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
)。
如何为原子计数器实现自动唯一绑定点,因此它们不是硬编码的,我可以混合着色器代码?
我可以看到一些可能的方法,但仍然存在链接后不更改它们的限制:
glBindAttribLocation
类似的唯一绑定位置。 是否有分配绑定点的机制? #define
宏。万不得已。我真的不想这样做。答案 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