为啥第二次调用 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?