绘制许多纹理小队 OpenGL ES 2.0
Drawing many textured squads OpenGL ES 2.0
我正在编写一个 Android 应用程序,其中绘制了一个网格,您可以四处移动并沿其方向移动。网格由大约 2000 到 5000 个四边形组成,每个四边形具有不同的纹理。我定义了 4 个顶点并使用索引缓冲区绘制每个四边形。在绘制之前,我使用模型矩阵定位它。当你可以在我的场景中移动时,我使用视锥体剔除,这在某些情况下提高了性能。不幸的是,可能会出现需要绘制所有四边形的情况,所以我想问一下如何防止绘制缓慢。
我无法使用纹理图集,因为所有纹理都非常大(从 256x256 到 1024x1024)。我认为为每个小队调用 glDrawElements() 是让我变慢的原因,但我不知道如何改变它。
我的另一个想法是将场景绘制到纹理上,然后将该纹理绑定到单个四边形以创建正在绘制的场景的幻觉。当用户靠近时,我可以重新绘制它以获得更好的分辨率。这行得通吗?
我期待任何形式的帮助。
I can't use a texture atlas as all of the textures are pretty big (from 256x256 to 1024x1024).
你可以将 64 个 256x256 的纹理放入一个 2048x2048 的图集中,这是一个巨大的数量,所以你绝对应该图集。即使将 4 个 1024x1024 放到 2048x2048 上也是值得的,它可以将您的绘图调用次数增加四分之一。
正如 WLGfx 在对您的问题的评论中所说,您应该批量处理使用相同纹理的所有四边形(使用地图集会有更多这样的四边形)。
我认为这就足够了,但您的完整 zoomed-out 视图中的绘制调用计数可能仍然很高。实施图集和批处理后,如果这里的性能仍然是个问题,您可以创建一个单独的 thumb-nail 纹理资产集,例如四分之一分辨率(因此 256x256 变为 64x64)。这个缩略图资源集只适合少数 2048x2048 地图集,当缩小到足够远时您可以切换到它。
Another idea I had would be to draw the scene to a texture and just bind this texture to a single quad to create an illusion of the scene being drawn. As the user gets closer I could redraw it for better resolution. Could this work?
这可行,只要您的场景非常静态,如果四边形每帧 moving/changing,那么它可能无济于事。此外,当您必须进行完全重绘时,可能会出现明显的帧速率故障。
我正在编写一个 Android 应用程序,其中绘制了一个网格,您可以四处移动并沿其方向移动。网格由大约 2000 到 5000 个四边形组成,每个四边形具有不同的纹理。我定义了 4 个顶点并使用索引缓冲区绘制每个四边形。在绘制之前,我使用模型矩阵定位它。当你可以在我的场景中移动时,我使用视锥体剔除,这在某些情况下提高了性能。不幸的是,可能会出现需要绘制所有四边形的情况,所以我想问一下如何防止绘制缓慢。
我无法使用纹理图集,因为所有纹理都非常大(从 256x256 到 1024x1024)。我认为为每个小队调用 glDrawElements() 是让我变慢的原因,但我不知道如何改变它。
我的另一个想法是将场景绘制到纹理上,然后将该纹理绑定到单个四边形以创建正在绘制的场景的幻觉。当用户靠近时,我可以重新绘制它以获得更好的分辨率。这行得通吗?
我期待任何形式的帮助。
I can't use a texture atlas as all of the textures are pretty big (from 256x256 to 1024x1024).
你可以将 64 个 256x256 的纹理放入一个 2048x2048 的图集中,这是一个巨大的数量,所以你绝对应该图集。即使将 4 个 1024x1024 放到 2048x2048 上也是值得的,它可以将您的绘图调用次数增加四分之一。
正如 WLGfx 在对您的问题的评论中所说,您应该批量处理使用相同纹理的所有四边形(使用地图集会有更多这样的四边形)。
我认为这就足够了,但您的完整 zoomed-out 视图中的绘制调用计数可能仍然很高。实施图集和批处理后,如果这里的性能仍然是个问题,您可以创建一个单独的 thumb-nail 纹理资产集,例如四分之一分辨率(因此 256x256 变为 64x64)。这个缩略图资源集只适合少数 2048x2048 地图集,当缩小到足够远时您可以切换到它。
Another idea I had would be to draw the scene to a texture and just bind this texture to a single quad to create an illusion of the scene being drawn. As the user gets closer I could redraw it for better resolution. Could this work?
这可行,只要您的场景非常静态,如果四边形每帧 moving/changing,那么它可能无济于事。此外,当您必须进行完全重绘时,可能会出现明显的帧速率故障。