在OpenGL中动态加载纹理的好方法是什么?

时间:2009-04-22 00:10:39

标签: c++ opengl textures

目前我正在将图像加载到第二个线程的内存中,然后在显示循环期间(如果需要纹理加载),加载纹理。

我发现我无法在第二个线程上加载纹理,因为OpenGL不喜欢它;也许这是可能的,但我做错了 - 所以如果真的有可能,请纠正我。

另一方面,如果我的失败是有效的 - 如何在不中断渲染循环的情况下加载纹理?目前纹理从内存加载大约需要1秒钟,虽然这不是一个主要问题,但对用户来说可能会有点刺激。

2 个答案:

答案 0 :(得分:4)

您可以使用您希望阅读文件的任何工具,在您喜欢的任何线程上将纹理从磁盘加载到内存。

但是,当您将其绑定到OpenGL时,需要在与该OpenGL上下文的呈现相同的线程上处理它。话虽如此,this discussion表明在第二个线程中使用PBO是一种选择,可以加快这一过程。

答案 1 :(得分:1)

你可以在任意数量的线程中将纹理从磁盘加载到RAM中,但是由于Reed的答案中提到的原因,OpenGL不会在多个线程中上传到VRAM。

鉴于来自磁盘的加载是最慢的部分,那就是你可能想要线程化的那一部分。加载线程构建要上载的纹理队列,然后该队列由拥有GL上下文的线程使用(但请注意您通过各种线程访问该队列)。您还可以考虑每帧上传N个纹理的非线程方法,其中N是一个不会使渲染速度过慢的数字。