OpenGL顶点和缓冲区

时间:2013-04-30 00:35:31

标签: arrays opengl buffer vertex

我一直在开发一个应用程序,我从一个txt文件中读取几个点,我需要创建一个线图来显示这些点。

我正在使用glDrawElements,包含一系列点和另一个索引数组。我需要显示以下内容:

  • x和y轴
  • 改变轴颜色的可能性
  • 点和颜色的几个缓冲区

到目前为止,我的方法如下:

  • 我创建了一个VBO
  • 有2个顶点数组对象,一个用于存储轴的信息,另一个用于存储图形
  • 我有几个缓冲区,用于多行和相应的索引
  • 每一行的颜色与点在同一缓冲区中,如{{XYZW},{RGBA}}。

我是否需要真正创建两个不同的顶点数组,或者我可以使用单个轴和图形使用相应的缓冲区。我的观点是,我们什么时候知道应该创建不同的顶点数组(glGenVertexArrays)来存储要绘制的东西?

1 个答案:

答案 0 :(得分:1)

正如您所希望的那样,在处理顶点数组对象时,必须使用glEnableVertexAttribArray启用属性数组。即使您可以为每个属性绑定不同的缓冲区,也不能为每个绘制调用绑定不同的属性或类似。这意味着VAO指向的所有内容必须存储相同的属性。当然,您可以忽略VAO给出的某些属性,但这可能会导致效率低下,这可能不是一个好习惯。

这再次意味着,每次使用相同VAO绑定的绘制调用都使用相同的属性。我认为这是确定您是否需要新VAO的最佳方法,首先确定您是否需要一组不同的属性。然后,您可以通过指向索引缓冲区中某个其他位置的一组索引来轻松确定要绘制的对象的哪一部分。

在面向对象的场景中(如游戏中,你有不同的网格),最实用的方法是简单地为每个网格创建一个或多个VAO。这允许您为每个网格(静态,动态或流)提供不同类型的缓冲区。你甚至可以有几个大缓冲区(每个缓冲区1到8 MB或类似),并有多个VAO使用相同的缓冲区。我经常这样做以避免频繁的内存分配。

我刚给你两个选择:

  • 每个新属性集的新VAO
  • 场景中每个不同对象的新VAO

这取决于您最方便的场景类型,但在大多数情况下,您可能不会发现性能差异很大。当然,有一种情况会稍微好一些,但你应该自己解决这个问题。

考虑到你的问题,我可以看到两个选项。您没有说明是否要经常更新顶点。如果你经常更改图形并更新顶点,我会给轴自己的VAO,因为它们永远不会改变,因为它们可以使用静态缓冲区,而图形本身可以使用动态或流缓冲区。但是如果轴是整个图形的一部分,因此意味着图形本身不会经常更新,为了方便起见,您可以将它们全部放在一个VAO中。

请记住,这些只是建议,您应该选择最适合您的框架和/或具有最佳性能或最简单的方法。

希望这有点帮助。