在OpenGL中存储许多小纹理

rlk*_*024 2 opengl

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

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

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

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

non*_*unk 8

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

当然,与往常一样,您最好的选择是在接近预期用例的情况下自行测试这些内容.OpenGL提供了大量的保证,但很多都会根据具体的实现而有所不同.