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

6

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

我发现我不能在第二个线程中加载纹理,因为OpenGL不喜欢这样做;也许这是可能的,但我做错了什么 - 如果这实际上是可能的,请纠正我。

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


这似乎是从系统内存加载纹理到VRAM的异常长时间。它有多大?你是否让OpenGL为你生成mipmap级别? - Don Neufeld
非常大,它们是医学图像。 - Nick Bolton
2个回答

4
你可以使用任何工具在任何线程上将纹理从磁盘加载到内存中,但是当你将其绑定到OpenGL时,它需要在与OpenGL上下文的渲染相同的线程上进行处理。话虽如此,这个讨论表明在第二个线程中使用PBO是一个选择,并且可以加速该过程。

第一段不是很有用,有点重复我说的哈哈 ;) 但第二段看起来非常有帮助,谢谢提供链接!我一定会去看看 :) - Nick Bolton
只是说你在那里做的是有效的 - 我不确定从你写的方式是否如此。祝好运! - Reed Copsey

1

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

考虑到从磁盘加载是最慢的部分,这可能是你想要使用线程的部分。加载线程会建立一个纹理队列等待上传,然后由拥有GL上下文的线程消费该队列(请注意各个线程对该队列的访问)。您还可以考虑每帧上传N个纹理的非线程化方法,其中N是不会使渲染速度过慢的数字。


@Justin,感谢你抽出时间来回答我的问题。也许我的问题表述不太好;目前重载工作是在第二个线程中完成的(这需要大约10秒左右的时间,因为有一些图像处理),然后在GLUT循环期间只需短暂的时间将像素复制到VRAM中;然而,虽然很短暂,但从用户体验的角度来看,它确实需要一个“不舒服”的时间。 - Nick Bolton
好的,明白了 - 当你弄清楚适合你的方法时,在这里发布一个答案! - Justicle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接