在OpenGL中存储许多小纹理

时间:2011-12-06 17:49:03

标签: opengl

我正在构建一个包含许多小纹理的OpenGL应用程序。我估计我会有几百个 任何特定时刻屏幕上的纹理。

有人可以推荐将所有这些纹理存储在内存中的最佳做法,以避免潜在的性能问题吗?

我也有兴趣了解OpenGL如何管理纹理。 OpenGL会尝试将它们存储到GPU内存中吗?如果是这样,我可以依靠多少GPU内存?如果没有,OpenGL多久会将纹理从应用程序内存传递到GPU,当发生这种情况时我应该担心延迟吗?

我正在使用OpenGL 3.3。我打算只使用现代功能,即没有立即模式的东西。

1 个答案:

答案 0 :(得分:8)

  1. 如果你有大量的小纹理,你最好将它们组合成一个大的纹理,每个小纹理占据已知的子区域(一种技术有时称为“纹理图集”)。切换哪个纹理绑定可能很昂贵,因为它会限制您可以批量合并的绘图量。通过组合成一个,您可以最小化重新绑定的次数。或者,如果您的纹理大小非常相似,您可能会考虑使用数组纹理(简介here)。
  2. OpenGL确实尝试尽可能地将纹理存储在GPU内存中,但我不相信它确实存在于显卡上。
  3. 您可用的GPU内存量取决于您运行的硬件以及运行时系统的其他要求。究竟“GPU内存”的含义会因机器而异,它可以是离散的,只能用于GPU,与主内存共享,或两者的某种组合。
  4. 假设您的应用程序不是经常修改纹理,您不需要特别关注延迟问题。你将为OpenGL提供一次纹理,从那时起它将管理它们在内存中的位置。假设您不需要更多的纹理数据,而不是每帧都能轻松放入GPU内存中,那么它不应该引起关注。如果确实需要使用大量纹理数据,请尝试确保将所有特定纹理一起批量使用,以最大限度地减少数据必须进行的往返次数。您还可以查看内置纹理压缩功能,为GL_COMPRESSED_RGBA的调用提供glTexImage2D之类的内容,有关详细信息,请参阅man页面。
  5. 当然,与往常一样,您最好的选择是在接近预期用例的情况下自行测试这些内容。 OpenGL提供了大量的保证,但很多都会因具体的实现而有所不同。