渲染大量四边形的有效方法(LibGDX/OpenGL ES)
Posted
技术标签:
【中文标题】渲染大量四边形的有效方法(LibGDX/OpenGL ES)【英文标题】:Effective way of rendering a lot of quads (LibGDX/OpenGL ES) 【发布时间】:2015-04-16 23:21:11 【问题描述】:我想问你渲染大量四边形的最有效或至少足够的方法是什么。我想渲染很多在网格中对齐的四边形(至少 150x150)。四边形不会有任何纹理,只有纯色背景(绿色、黑色),但可以在运行时更改颜色。感谢您的回答。
【问题讨论】:
您能否详细说明如何使用这些四边形?它们会移动(作为网格还是作为单个对象)? 它们不会移动,位置是静止的,只有颜色会改变。 【参考方案1】:您总是可以将其抽象为某种可编辑的网格对象,该对象可以保留要绘制的点的索引列表、按索引顺序绘制的顶点列表以及每个顶点的颜色。然后,您可以在运行时动态添加,然后在每次更改时准备网格,这会将所有内容绑定到 VBO,然后您可以简单地绘制它。其他一切都只是实现细节,但如果你对 OpenGL VAO 和 VBO 有相当的了解,应该是相当微不足道的。但是,如果您需要,我可以提供帮助。
更新(由于评论空间不足):
如果我没记错的话,drawElements 是要走的路。不要单独绘制每个对象,如果这样做,您还不如使用立即模式。 glDrawElements 基本上将所有信息一次批处理到您的图形卡,并尽可能并行地完成。如果您一次只绘制一件东西,您将无法充分利用 GPU 的强大功能。
在您发表评论后,您需要根据自己的需要做出一些设计决策。所以你想要平移单个网格,然后最终我们想要建立一个巨大的缓冲区,让我们可以一次绘制所有内容。所以第一步是确定有多少网格会移动。
假设我们有 2 个移动的块,但其余的块是静止的,我们可以从这 2 个块创建一个单独的可编辑网格,并从剩余的块创建我们的巨型网格。要检查的另一件事是,我们的网格多久移动一次?如果它可能每分钟左右移动一次,我会说重新创建整个网格并再次绑定数据并不是什么大问题(假设网格不是大得离谱,在这种情况下,您可以创建子网格并只更新那些需要更新)。
关于我上一段中的要点,您将使用翻译后的顶点做什么?如果您仅将其用于视觉目的,您可以为每个需要翻译的子网格的变换创建一个模型矩阵。但是,如果您打算将它用于碰撞检测之类的事情,您将需要存储此信息,以便可以在其他地方使用它。但是,您仍然可以只使用变换矩阵而不是更新 VBO。
希望这在某种程度上有所帮助! :)
【讨论】:
那么我应该创建一些包含顶点、颜色和索引的对象,然后创建一个包含所有对象的顶点、颜色等的大缓冲区吗?或分别绘制每个对象?我也想问你什么更有效? glDrawElements 还是 glDrawArrays?当然是为了这个目的。如果我只创建一个顶点数组并且我的对象将具有 Vec 位置,那么如果我为每个对象进行平移,会不会浪费性能? (抱歉英语不好) 感谢您的回答,这非常有帮助 :) 所以基本上我将创建代表四边形的对象 pos,color,indices 然后创建一个大 VBO 与 pos + 所有对象的颜色 + 一个大数组索引并在一批中绘制它,对吗?这里不是更有效率吗?因为所有对象的大小都相同,所以只有位置和颜色可以不同,并且位置只会设置一次(在初始化时),然后对象只能改变颜色。我读了一些关于实例化的文章,但后来我发现它可能不适用于 OpenGL ES 是的,所以使用 VBO,所有内容都将在一批中绘制,这就是使用 VBO 绑定所有顶点数据的优势。它基本上将所有内容都交给 GPU,然后将其全部绘制出来。在显示列表的注释上,您可以看到是的,但我不熟悉 ES,以及 API 是否与普通 API 相同。但是,是的,你有这个想法。让我知道您是否可以正常工作,并可能发布一些屏幕截图或其他内容的链接:) 感谢 Daniel :) 我创建了一些代表 Quad 的类(包含顶点、索引),然后创建名为 Mesh 的 Libgdx 对象,设置顶点属性,创建一个包含所有顶点、索引的大数组并将其绑定到网格,然后渲染该网格。速度非常好,所以我认为这足以满足我的目的。再次感谢您的意愿:) 但是如果我想改变任何特定四边形的颜色怎么办?我需要重新创建整个缓冲区吗?以上是关于渲染大量四边形的有效方法(LibGDX/OpenGL ES)的主要内容,如果未能解决你的问题,请参考以下文章