【问题标题】:OpenGL Vertex and BuffersOpenGL 顶点和缓冲区
【发布时间】:2013-04-30 00:35:30
【问题描述】:
我一直在开发一个应用程序,我从一个 txt 文件中读取了几个点,我需要创建一个折线图来显示这些点。
我正在使用 glDrawElements,带有一个点数组和另一个索引数组。我需要显示以下内容:
- x 和 y 轴
- 可以更改轴颜色
- 点和颜色的几个缓冲区
到目前为止,我的方法如下:
- 我创建了一个 VBO
- 有 2 个顶点数组对象,一个用于存储轴信息,另一个用于图形
- 我有几个缓冲区,用于多行和相应的索引
- 每条线的颜色与点在同一个缓冲区中,例如 {{XYZW}、{RGBA}}。
我是否需要真正创建两个不同的顶点数组,或者我可以为轴和图形使用一个具有相应缓冲区的单个顶点数组。我的意思是,我们什么时候知道我们应该创建不同的顶点数组(glGenVertexArrays)来存储要绘制的东西?
【问题讨论】:
标签:
arrays
opengl
buffer
vertex
【解决方案1】:
正如您所希望的,在处理顶点数组对象时,您必须使用glEnableVertexAttribArray 启用属性数组。即使您可以为每个属性绑定不同的缓冲区,您也不能在“每个绘制调用”或类似的情况下绑定不同的属性。这意味着 VAO 指向的所有内容都必须存储相同的属性。当然,您可以忽略 VAO 提供的某些属性,但这可能会导致效率低下,并且可能不是一个好的做法。
这再次意味着,每个具有相同 VAO 绑定的绘图调用都使用相同的属性。我认为这是确定是否需要新 VAO 的最佳方法,首先确定是否需要一组不同的属性。然后,您可以通过指向索引缓冲区中某个其他位置的一组索引轻松确定要绘制对象的哪一部分。
在更面向对象的场景中(如游戏,其中您有不同的网格),最实用的方法是简单地为每个网格创建一个或多个 VAO。这允许您为每个网格(静态、动态或流)拥有不同类型的缓冲区。您甚至可以拥有几个大缓冲区(每个缓冲区 1 到 8 MB 或类似的缓冲区)并拥有多个使用相同缓冲区的 VAO。我经常这样做是为了避免频繁的内存分配。
我只是给了你两个选择:
- 每组新属性都有一个新的 VAO
- 场景中每个不同对象的新 VAO
这取决于您拥有的最方便的场景类型,但在大多数情况下,您可能不会发现性能有那么大的差异。当然,在某些情况下性能稍好一些,但您应该自己弄清楚。
考虑到您的问题,我可以看到两个选项。你没有说你是否会经常更新顶点。如果您不断更改图形并更新顶点,我会给轴提供自己的 VAO,因为它们永远不会改变,因此它们可以使用静态缓冲区,而图形本身可以使用动态或流缓冲区。但是,如果轴是整个图表的一部分,这意味着图表本身不会经常更新,您可以将它们全部放在一个 VAO 中以方便使用。
请记住,这些只是建议,您应该选择最适合您的框架和/或具有最佳性能的,或者只是最方便的。
希望这会有所帮助。