渲染大量四边形的有效方法 (LibGDX/OpenGL ES)
Effective way of rendering a lot of quads (LibGDX/OpenGL ES)
我想问你渲染大量四边形最有效或至少足够的方法是什么。我想渲染很多在网格中对齐的四边形(至少 150x150)。四边形没有任何纹理,只有纯色背景(绿色、黑色),但颜色可以在运行时更改。感谢您的回答。
你总是可以将它抽象为某种可编辑的网格对象,它可以保留要绘制的点的索引列表、按索引顺序绘制的顶点列表,以及每个顶点的颜色顶点。然后,您可以在 运行 时间动态添加到此,然后在每次更改时准备网格,这会将所有内容绑定到 VBO,然后您可以简单地绘制它。其他一切都只是实现细节,但如果您对 OpenGL 有一定的了解,VAO 和 VBO 应该是相当简单的。但如果您需要,我可以提供帮助。
更新(评论中space不足):
如果我没记错的话,drawElements 是正确的选择。不要单独绘制每个对象,如果这样做,您还不如使用立即模式。 glDrawElements 基本上是一次性将所有信息分批发送到您的显卡,并尽可能并行完成。如果您一次画一个东西,您将无法充分利用 GPU 的强大功能。
在您发表评论后,您需要根据自己的需要做出一些设计决策。所以你想要翻译单个网格,然后最终我们想要建立一个巨大的缓冲区,让我们能够一次绘制所有东西。所以第一步是确定有多少网格将移动。
假设我们有 2 个移动的块,但其余的是静止的,我们可以从这 2 个块创建一个单独的可编辑网格,并从剩余的块创建我们的巨型网格。另一件要检查的事情是,我们的网格将多久移动一次?如果它可能每分钟左右移动一次,我会说重新创建整个网格并再次绑定数据并不是什么大问题(假设网格不是大得离谱,在这种情况下您可以创建子网格并只更新那些需要更新)。
关于我上一段中的观点,您将使用转换后的顶点做什么?如果您只是将它用于视觉目的,您可以为每个需要转换的子网格创建一个模型矩阵来进行转换。但是,如果您打算将它用于诸如碰撞检测之类的事情,您将需要存储此信息,以便它可以在其他地方使用。但是,您仍然可以仅使用变换矩阵而不是更新 VBO。
希望这对您有所帮助! :)
我想问你渲染大量四边形最有效或至少足够的方法是什么。我想渲染很多在网格中对齐的四边形(至少 150x150)。四边形没有任何纹理,只有纯色背景(绿色、黑色),但颜色可以在运行时更改。感谢您的回答。
你总是可以将它抽象为某种可编辑的网格对象,它可以保留要绘制的点的索引列表、按索引顺序绘制的顶点列表,以及每个顶点的颜色顶点。然后,您可以在 运行 时间动态添加到此,然后在每次更改时准备网格,这会将所有内容绑定到 VBO,然后您可以简单地绘制它。其他一切都只是实现细节,但如果您对 OpenGL 有一定的了解,VAO 和 VBO 应该是相当简单的。但如果您需要,我可以提供帮助。
更新(评论中space不足):
如果我没记错的话,drawElements 是正确的选择。不要单独绘制每个对象,如果这样做,您还不如使用立即模式。 glDrawElements 基本上是一次性将所有信息分批发送到您的显卡,并尽可能并行完成。如果您一次画一个东西,您将无法充分利用 GPU 的强大功能。
在您发表评论后,您需要根据自己的需要做出一些设计决策。所以你想要翻译单个网格,然后最终我们想要建立一个巨大的缓冲区,让我们能够一次绘制所有东西。所以第一步是确定有多少网格将移动。
假设我们有 2 个移动的块,但其余的是静止的,我们可以从这 2 个块创建一个单独的可编辑网格,并从剩余的块创建我们的巨型网格。另一件要检查的事情是,我们的网格将多久移动一次?如果它可能每分钟左右移动一次,我会说重新创建整个网格并再次绑定数据并不是什么大问题(假设网格不是大得离谱,在这种情况下您可以创建子网格并只更新那些需要更新)。
关于我上一段中的观点,您将使用转换后的顶点做什么?如果您只是将它用于视觉目的,您可以为每个需要转换的子网格创建一个模型矩阵来进行转换。但是,如果您打算将它用于诸如碰撞检测之类的事情,您将需要存储此信息,以便它可以在其他地方使用。但是,您仍然可以仅使用变换矩阵而不是更新 VBO。
希望这对您有所帮助! :)