【发布时间】:2016-12-22 14:29:03
【问题描述】:
我很好奇在几个 OpenGL 缓冲区对象相关函数中使用的 *BlockBinding 参数。
例如glUniformBlockBinding中的uniformBlockBinding参数,glShaderStorageBlockBinding中的storageBlockBinding,以及glBindBufferRange和glBindBufferBase中对应的index参数。
我知道,如果使用以下布局限定符在着色器中设置绑定点,则无需调用 glUniformBlockBinding 和 glShaderStorageBlockBinding:
layout (binding = 0) blockName {...}
通过在我的机器上进行测试,我注意到了三件事:
1) 使用 glUniformBlockBinding 和 glShaderStorageBlockBinding 设置绑定点会覆盖使用布局限定符在着色器中设置的绑定点。
2) 从glGetUniformBlockIndex 和glGetProgramResourceIndex 返回的块索引对于相同类型 的每个块按0 到n 排序。例如,如果着色器包含 3 个统一块和 2 个缓冲区块,则返回的索引将分别为 [0,1,2] 和 [0,1]。
3) 绑定点,无论哪种方式设置,都不会在类型之间发生冲突。例如,将统一块设置为 binding = 0,将缓冲区块设置为 binding = 0 是完全安全的。
考虑到这些假设(如果有任何不一定正确且纯属巧合,请纠正我),我有什么理由不应该让我的代码自动设置@987654336 @ 对应块索引的参数,省去了通过gl*BlockBinding 或布局限定符手动指定它们的麻烦。
【问题讨论】: