渲染大量四边形的有效方法(LibGDX/OpenGL ES)

4

我想问你,渲染大量四边形的最有效或至少足够的方法是什么。我想要在网格中对齐许多四边形(至少150x150)。这些四边形将没有任何纹理,只有纯色背景(绿色、黑色),但颜色可以在运行时更改。谢谢您的回答。


你能否提供一些关于如何使用这些四边形的更多细节?它们会移动吗(作为网格或单个对象)? - Miklas
它们不会移动,位置将保持静态,只有颜色会改变。 - Caller
1个回答

1
你可以将其抽象为可编辑的网格对象,该对象可以保持要绘制的点的索引列表,按索引顺序绘制的顶点列表,以及每个顶点的颜色。然后你可以在运行时动态添加它,并在每次更改时准备网格,这将绑定一切到一个VBO,然后你可以简单地绘制它。其他所有东西都只是实现细节,但如果你对OpenGL VAO和VBO有足够的了解,那么应该相当容易。否则,如果需要,我可以提供帮助。
更新(因为评论中没有足够的空间):
如果我记得正确,drawElements是正确的方法。不要单独绘制每个对象,如果你那样做,你可能会使用即时模式。glDrawElements基本上将所有信息一次性批处理到图形卡中,尽可能并行地完成所有操作。如果你每次只绘制一件事情,你就无法充分利用GPU的能力。

在您的评论之后,这就是您需要根据所需进行一些设计决策的地方。因此,您想要翻译单个网格,最终我们希望建立一个巨大的缓冲区,使我们能够一次性绘制所有内容。因此,第一步是确定网格中将移动多少。

假设我们有2个移动的块,但其余的是静止的,我们可以从这2个块创建一个可编辑的单独网格,并从其余块创建我们的巨型网格。另一件要检查的事情是,我们的网格会经常移动吗?如果它每分钟移动一次左右,我会说重新创建整个网格并再次绑定数据不是什么大问题(假设网格不是非常巨大,在这种情况下,您可以创建子网格并仅更新需要更新的那些)。

关于我先前段落的观点,您将使用翻译后的顶点做什么?如果您只是出于视觉目的使用它,则可以为需要翻译的每个子网格创建变换的模型矩阵。然而,如果您将其用于诸如碰撞检测之类的事情,您需要存储此信息,以便可以在其他地方使用。但是,您仍然可以仅使用变换矩阵而不更新VBO。

希望这能在某种程度上有所帮助!:)


那我应该创建一个对象,它包含顶点、颜色和索引,然后创建一个大缓冲区,其中包含所有对象的顶点、颜色等等?还是分别绘制每个对象?我还想问一下,什么更有效?当然是glDrawElements还是glDrawArrays?如果我只创建一个顶点数组,我的对象将具有Vec位置,那么如果我为每个对象进行平移,这是否会浪费性能?(对不起我的英语不好) - Caller
谢谢你的回答,非常有帮助 :) 所以基本上我会创建一个代表四边形的对象,包括位置、颜色和索引,然后创建一个大的VBO,其中包含所有对象的位置和颜色,再加上一个包含所有索引的大数组,并在一个批次中绘制它,是这样吗?难道没有更有效率的方法吗?因为所有对象都是相同大小的,只有位置和颜色可能不同,而位置只会在初始化时设置一次,然后对象只能更改颜色。我读到了一些关于实例化的东西,但后来发现它可能不适用于OpenGL ES < 3。感谢您的建议和提示。 - Caller
是的,使用VBO可以将所有内容一次性绘制出来,这就是使用VBO绑定所有顶点数据的优势。它基本上将所有内容交给GPU,并在一个批次中绘制所有内容。关于显示列表,你可以考虑一下,但我不熟悉ES,如果API与普通API相同的话。但是,你已经有了想法。如果你成功了,请让我知道,并可能发布一些截图或其他东西的链接 :) - Daniel
谢谢Daniel :) 我创建了一些代表四边形(包含顶点和索引)的类,然后创建了Libgdx的对象称为Mesh,设置了顶点属性,创建了一个包含所有顶点、索引的大数组,并将其绑定到Mesh上,最后渲染该Mesh。速度相当不错,所以我认为它对我的目的足够了。再次感谢您的热心帮助 :) - Caller
但是如果我想要改变任何特定的四边形的颜色呢?难道我需要重新创建整个缓冲区吗? - Caller
显示剩余2条评论

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