glUniformBlockBinding 和 glBindBufferBase 之间的排序重要吗?

Posted

技术标签:

【中文标题】glUniformBlockBinding 和 glBindBufferBase 之间的排序重要吗?【英文标题】:Is ordering between glUniformBlockBinding and glBindBufferBase important? 【发布时间】:2013-07-24 07:23:35 【问题描述】:

使用 UBO 时,我们将统一块绑定到绑定点。然后我们还将 UBO 绑定到同一个绑定点: 类似:

glUseProgram(ProgramName);
glUniformBlockBinding(ProgramName, uniformLocation, bindingPoint);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, bufId);

我有两个问题:

    我应该先指定 glUniformBlockBinding 还是 glBindBufferBase 或者顺序无关紧要? 如果我的理解是正确的,那么只有在我们用数据更新了 UBO 之后才必须调用 glBindBufferBase。如果这是正确的,那么这就回答了我的第一个问题。

【问题讨论】:

uniformLocation 这不是一个统一的位置。那是一个统一的块索引。这不是一回事。 “如果这是正确的,那么这回答了我的第一个问题。” - 不,它没有(参考 “答案” 不是“是正确的”)。为什么要这样做? 【参考方案1】:

glUniformBlockBinding 在程序中设置状态(这就是为什么你不应该每帧都调用它的原因)。 glBindBufferRange 在 OpenGL 上下文中设置状态。在您渲染之前,两者都不会影响另一个,所以不,哪个都没有关系。

是的,你不能调用glBindBufferRange(或Base,它是根据Range定义的)​​,除非你已经为缓冲区对象分配了存储空间。

【讨论】:

谢谢尼科尔。这回答了我的问题。 顺便说一句,您能否解释一下在程序中设置状态与在 GL 上下文中设置状态之间的区别? @kvikram:也许你应该花点时间来learn a bit more about OpenGL。

以上是关于glUniformBlockBinding 和 glBindBufferBase 之间的排序重要吗?的主要内容,如果未能解决你的问题,请参考以下文章

顶点缓冲区绑定索引和统一缓冲区绑定点?

10G/40G/100G光模块的类型和应用

gcc与g++:联系区别和命令

G.1X 和 G.2X 的 AWS Glue 工作线程定价详细信息

vim g 和 % 区别

需要帮助 w/ 恼人的 Makefile 错误 -- g++: g++ 和 shell 错误 -- 和 Multi-Makefile 设计建议