绘制许多纹理小队OpenGL ES 2.0

时间:2017-02-04 23:05:59

标签: java android performance opengl-es drawing

我正在编写一个Android应用程序,其中绘制了一个网格,您可以四处移动并沿着它的方向移动。网格由大约2000到5000个四边形组成,每个四边形具有不同的纹理。我定义了4个顶点并使用索引缓冲区绘制每个四边形。在绘制之前,我使用模型矩阵定位它。当你可以在我的场景中移动时,我会使用视锥体剔除,这会在某些情况下提高性能。不幸的是,我可能需要绘制所有四边形,所以我想问一下如何防止慢速绘制。

我无法使用纹理图集,因为所有纹理都非常大(从256x256到1024x1024)。我觉得为每个小队打电话给glDrawElements()是让我变慢的原因,但我不知道如何改变它。

我的另一个想法是将场景绘制到纹理,然后将此纹理绑定到单个四边形,以创建所绘制场景的错觉。随着用户越来越近,我可以重新绘制它以获得更好的分辨率。这可行吗?

我期待着提供任何帮助。

1 个答案:

答案 0 :(得分:0)

  

我无法使用纹理图集,因为所有纹理都非常大(从256x256到1024x1024)。

你可以将64个256x256纹理放入2048x2048的地图集中,这是一个巨大的数量,所以你绝对应该使用地图册。即使将4个1024x1024连接到2048x2048也是值得做的,它可以将您的绘制通话计数加以计算。

正如WLGfx在你的问题的评论中所说,你应该批处理任何使用相同纹理的四边形(使用图集会有更多这些纹理)。

我认为这已经足够了,但是在完全缩小的视图中你仍然可能有相当高的抽签计数。在实现了图集和批处理之后,如果此处的性能仍然存在问题,您可以创建一个单独的缩略图纹理资产集,例如四分之一分辨率(因此256x256变为64x64)。这个缩略图资产集只适合少数2048x2048的图册表,你可以在缩小到足够远的时候切换到它。

  

我的另一个想法是将场景绘制到纹理,然后将此纹理绑定到单个四边形,以创建所绘制场景的错觉。随着用户越来越近,我可以重新绘制它以获得更好的分辨率。这可行吗?

这可以工作,只要您的场景非常静态,如果四边形移动/改变每一帧,那么它可能没有帮助。此外,当您必须进行完全重绘时,可能会出现明显的帧率故障。