在OpenGL中动态加载纹理的好方法是啥?
Posted
技术标签:
【中文标题】在OpenGL中动态加载纹理的好方法是啥?【英文标题】:What is a good way to load textures dynamically in OpenGL?在OpenGL中动态加载纹理的好方法是什么? 【发布时间】:2009-04-22 00:10:38 【问题描述】:目前我正在第二个线程上将图像加载到内存中,然后在显示循环期间(如果需要加载纹理),加载纹理。
我发现我无法在第二个线程上加载纹理,因为 OpenGL 不喜欢这样;也许这是可能的,但我做错了什么 - 如果这实际上是可能的,请纠正我。
另一方面,如果我的失败是有效的 - 如何在不中断渲染循环的情况下加载纹理?目前,纹理从内存中加载大约需要 1 秒,虽然这不是一个大问题,但对用户来说可能会有点烦人。
【问题讨论】:
将纹理从系统内存加载到 VRAM 似乎需要很长时间。它有多大,您是否让 OpenGL 为您生成 mipmap 级别? 非常大,是医学影像。 【参考方案1】:您可以使用您希望读取文件的任何工具,在您喜欢的任何线程上将纹理从磁盘加载到内存。
但是,当您将其绑定到 OpenGL 时,需要在与该 OpenGL 上下文的渲染相同的线程上进行处理。话虽如此,this discussion 建议在第二个线程中使用 PBO 是一种选择,并且可以加快进程。
【讨论】:
第一段不是很有帮助,有点重复我所说的呵呵;)但第二段看起来很有帮助,谢谢你的链接!我一定会检查出来的:) 只是说你在那里做的事情是有效的——我不确定你是怎么写的。祝你好运!【参考方案2】:您当然可以在任意数量的线程中将纹理从磁盘加载到 RAM,但由于 Reed 的回答中提到的原因,OpenGL 不会在多个线程中上传到 VRAM。
鉴于从磁盘加载是最慢的部分,这就是您可能想要线程化的部分。加载线程建立一个要上传的纹理队列,然后这个队列被拥有 GL 上下文的线程消耗(但是请注意,您可以通过各种线程访问该队列)。您还可以考虑一种非线程方法,即每帧上传 N 个纹理,其中 N 是一个不会过多减慢渲染速度的数字。
【讨论】:
@Justin,感谢您抽出宝贵时间回答。也许我的问题措辞不好;目前,重载加载是在第二个线程中完成的(加载大约需要 10 秒左右,因为有一些图像处理)然后在 GLUT 循环期间将像素复制到 VRAM 只需要很短的时间;然而,虽然简短,但在用户体验方面确实需要“不舒服”的时间。 好吧,这是有道理的——当你弄清楚什么对你有用时,在这里发布答案!以上是关于在OpenGL中动态加载纹理的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章