2011-12-22 135 views
3

我沿着this教程读,我得到了朝如何使用顶点缓存结束,我看到的,是我生成,并呼吁glBindBuffer上一次已经是顶点缓冲我不得不第二次绑定:为什么第二次调用glBindBuffer?

glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle); 

我对openGL仍然很陌生(比如3天),所以我试图围绕着这些东西是如何工作的。我花了大部分时间在khronos或opengl.org上阅读有关命令,但我无法弄清楚为什么这个命令会被调用两次。任何提示?谢谢。

回答

7

这是否严格具体的例子需要第二绑定?不。OpenGL保留状态,所以如果一个缓冲区对象绑定到一个目标,那么它将保持绑定状态,直到你将其他的东西绑定到该目标。

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

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

因此,如果您打算从特定缓冲区中提取数据,则应将其绑定并设置适当的状态(调用gl*Pointer)。

+0

啊。这就是为什么我的代码不会给我带来问题,即使它可能是错误的。精辟!谢谢。这对学习所有这些内容非常有帮助。 – Narcolapser 2011-12-22 04:21:29

5

你必须绑定和解除绑定缓冲区从'C'复制到它并从OpenGL中绘制。 认为它是程序和图形之间的锁定/解锁。

所以序列
创建
绑定
东西数据
解除绑定

绑定
显示
解除绑定

+0

哦。我懂了。谢谢,这是有道理的。 (并且还指出了我的代码中可能存在的错误...) – Narcolapser 2011-12-22 04:15:58

+0

用opengl记住一件重要的事情就是它是一个状态机 - 设置保持设置,直到你改变它们为止 – 2011-12-22 04:23:39

2

摘要:第二个通常取消绑定第一个。

如果没有名称缓冲区的缓冲区对象存在,则使用该名称创建一个。当缓冲区对象绑定到目标时,该目标的上一个绑定会自动断开。

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

相关问题