2011-12-06 76 views
2

我正在构建一个带有许多小纹理的OpenGL应用程序。我估计在任何时候屏幕上都会有几百个 的纹理。在OpenGL中存储很多小纹理

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

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

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

回答

8
  1. 如果您有大量的小纹理,您最好将它们组合成一个大纹理,每个小纹理占据已知的子区域(一种技术有时称为“纹理图集”) 。切换绑定的纹理可能会很昂贵,因为它会限制您可以将多少图形拼凑在一起。通过合并成一个你可以减少重新绑定的次数。或者,如果您的纹理尺寸非常相似,则可以使用数组纹理(介绍here)。
  2. OpenGL确实尝试尽可能在GPU内存中存储您的纹理,但我不认为它确实存在于显卡中。
  3. 您可用的GPU内存量将取决于您运行时所运行的硬件以及系统上的其他需求。究竟“GPU内存”的含义在不同的机器上会有所不同,它可以是分立的,只能用于GPU,与主内存共享或两者的某种组合。
  4. 假设你的应用程序不是经常修改纹理,你不需要特别关心延迟问题。您将一次向OpenGL提供纹理,从那时起,它将管理它们在内存中的位置。假设你不需要更多的纹理数据,而不需要每帧可以容易地放入GPU内存,它不应该引起关注。如果您确实需要使用大量纹理数据,请尝试确保将所有特定纹理的使用批量合并到一起,以尽量减少数据必须进行的往返行程数。您还可以查看内置的纹理压缩设施,为您致电glTexImage2D提供类似GL_COMPRESSED_RGBA的内容,请参阅man页面以获取更多详细信息。

当然,与往常一样,您最好的选择是在接近预期用例的情况下自行测试这些事情。 OpenGL提供了很多保证,但是很大程度上取决于具体的实现。

+0

+1纹理图案。伟大的方法。我希望有足够的教程来实现它。 – Marnix

+0

谢谢!这很好。关于教程:这听起来像纹理图谱与精灵图基本上是相同的想法,关于它有很多可用的资源。问题:我在其他地方看过的书中表明,我通常可以指望至少有256MB的GPU内存,如果我的纹理+几何图形超过这个数值,我的性能就会大打折扣。这听起来是对的吗? – rlkw1024

+0

@Jarrett 256 MB听起来像是一个非常合理的下限,假设你不是针对低端电脑。任何使用过去4年或5年的独立显卡的应该至少有256 MB的VRAM。如果你的目标是更高端的,尽管更新的计算机,你可以依靠至少两倍。即使是配备专用卡的笔记本电脑,现在通常也会有VRAM。 – nonVirtualThunk