为什么第二次调用glBindBuffer?

时间:2011-12-22 03:54:46

标签: opengl

我在this教程中阅读并且我在使用Vertex Buffers的过程中走到了尽头,我看到我生成的顶点缓冲区并且一次调用了glBindBuffer我已经必须绑定第二个时间:

glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);

我对openGL来说还是一个新手(比如3天),所以我试着想一想这些东西是如何工作的。我花了大部分时间在khronos或opengl.org上阅读有关命令的内容,但我无法弄清楚为什么这个命令会被调用两次。任何提示?感谢。

3 个答案:

答案 0 :(得分:7)

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

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

执行此操作后,代码会中断,因为代码期望绑定的缓冲区实际上并未绑定。因此,除非你擅长管理状态并且真正知道你正在做什么(如果你仍在学习教程,答案是“不”),你应该设置你想要做的任何你想要的状态。 / p>

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

答案 1 :(得分:5)

你必须绑定和取消绑定缓冲区以从'C'复制到它并从openGL中用它绘制。 将其视为程序和图形之间的锁定/解锁。

所以序列是
创建
绑定
东西数据
unbind

绑定
显示
unbind

答案 2 :(得分:2)

简介:第二个通常解开第一个。

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

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