为啥第二次调用 glBindBuffer?

Posted

技术标签:

【中文标题】为啥第二次调用 glBindBuffer?【英文标题】:why the second call to glBindBuffer?为什么第二次调用 glBindBuffer? 【发布时间】:2011-12-22 03:54:46 【问题描述】:

我正在阅读this 教程,我在如何使用顶点缓冲区方面接近尾声,我看到我生成的顶点缓冲区并在一次调用 glBindBuffer 时必须再次绑定:

glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);

我对 openGL 还是很陌生(比如 3 天),所以我想弄清楚这些东西是如何工作的。我大部分时间都花在 khronos 或 opengl.org 上阅读命令,但我不明白为什么这个命令会被调用两次。任何提示?谢谢。

【问题讨论】:

【参考方案1】:

该特定示例是否严格需要第二个绑定?不会。OpenGL 会保留状态,因此如果缓冲区对象绑定到目标,那么它将保持绑定状态,直到您将其他内容绑定到该目标。

但是,如果在创建第二个缓冲区的缓冲区之后插入代码,会发生什么情况?毕竟,您可能想要两个对象。或者 10。或者你想要多少;他们不必共享缓冲区对象。

一旦你这样做了,你的代码就会中断,因为你的代码预期要绑定的缓冲区实际上并没有绑定。因此,除非你擅长管理状态并且真的知道你在做什么(如果你还在学习教程,答案是“不”),你应该设置你需要的任何状态来做你想做的事情。

因此,如果您打算从特定缓冲区中绘制,您应该绑定它并设置适当的状态(gl*Pointer 调用)。

【讨论】:

啊。这就是为什么我的代码没有给我带来问题,即使它可能是错误的。有见地!谢谢。这对学习所有这些东西很有帮助。【参考方案2】:

您必须绑定和取消绑定缓冲区才能从“C”复制到它并从 openGL 使用它进行绘制。 将其视为程序和图形之间的锁定/解锁。

所以顺序是 创建 绑定 资料资料 解绑

绑定 显示 解绑

【讨论】:

哦。我知道了。谢谢,这是有道理的。 (并且还指出了我的代码中的一个潜在错误......) 使用 opengl 要记住的重要一点是,它是一个状态机 - 设置保持不变,直到您更改它们【参考方案3】:

简介:第二个通常会解除第一个的绑定。

如果不存在名称为 buffer 的缓冲区对象,则使用该名称创建一个。当缓冲区对象绑定到目标时,该目标的先前绑定会自动中断。

缓冲区对象名称是无符号整数。零值是保留的,但每个缓冲区对象目标没有默认缓冲区对象。相反,缓冲区设置为零有效地取消绑定以前绑定的任何缓冲区对象,并恢复该缓冲区对象目标的客户端内存使用情况(如果该目标支持)。缓冲区对象名称和对应的缓冲区对象内容在当前 GL 渲染上下文的共享对象空间中是本地的;只有当两个渲染上下文通过适当的 GL windows 接口函数显式启用上下文之间的共享时,它们才会共享缓冲区对象名称。 参考:https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml

【讨论】:

以上是关于为啥第二次调用 glBindBuffer?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当android在java中调用第二次Web服务时会创建新的会话

为啥函数第一次调用比第二次和第三次调用花费更多的时间等等?

为啥我的 ViewController 在第二次调用后才发布,iOS ARC?

为啥第二次调用接收没有在 Erlang shell 中检索消息?

为啥我的 FFI 函数的第二次调用无法匹配字符串比较?

为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?