OpenGL顶点和缓冲区

3

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

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

  • x和y轴
  • 可以更改轴的颜色的可能性
  • 多对缓冲区用于点和颜色

到目前为止,我的方法是:

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

我是否真的需要创建两个不同的顶点数组,还是可以使用单个顶点数组同时处理轴和图形,并具有相应的缓冲区。 我的问题是,我们什么时候知道我们应该创建不同的顶点数组(glGenVertexArrays)来存储要绘制的元素?

1个回答

1
希望你已经注意到,当处理顶点数组对象时,你需要使用glEnableVertexAttribArray启用属性数组。尽管你可以为每个属性绑定不同的缓冲区,但你不能在“每个绘制调用”或类似情况下绑定不同的属性。这意味着,由VAO指向的所有内容必须具有相同的属性存储。当然,你可以忽略VAO提供的一些属性,但这可能会导致低效,并且这可能不是一个好的实践。
这再次意味着,使用相同VAO绑定的每个绘制调用都使用相同的属性。我认为,确定是否需要新的VAO的最佳方法是首先确定是否需要不同的属性集。然后,你可以通过指向索引缓冲区中某个其他位置的索引集来轻松确定要绘制的物体的哪个部分。
在更面向对象的场景中(比如游戏,其中有不同的网格),最实用的方法是为每个网格创建一个或多个VAO。这允许你针对每个网格拥有不同类型的缓冲区(静态、动态或流)。你甚至可以有几个大缓冲区(每个缓冲区1到8 MB或类似大小),并且有多个VAO使用相同的缓冲区。我经常这样做以避免频繁的内存分配。
我刚刚给了你两个选项:
  • 每个新属性集合都需要一个新的VAO
  • 场景中每个不同对象都需要一个新的VAO

这取决于您所拥有的场景类型,哪种方式最为方便,但在大多数情况下,您可能不会发现性能上的太大差异。当然,也有一些情况下其中一种稍微好一些,但您应该自己找出来。

考虑到您的问题,我可以看到两个选择。您没有说您是否经常更新顶点。如果您不断更改图形并更新顶点,则应将轴分配其自己的VAO,因为它们永远不会更改,因此可以使用静态缓冲区,而图形本身可以使用动态或流缓冲区。但是,如果轴是整个图形的一部分,这意味着图形本身不会经常更新,您可以将它们全部放入单个VAO以方便操作。

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

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接