我有一个对象类型,它根据旋转(模拟3D)将纹理(正确地)渲染到2D网格上。但是,为每个视图加载/绑定新的纹理图像非常慢。禁用视图相关的纹理加载会导致非常快速的性能。
缓冲对象的所有视图/纹理可能不是一个好的选择,它可以包含720个视图(单独的图像)的顺序,每个视图可以是600x1000像素。也不保证最终用户系统规格,这是一个外围应用程序。
在按需加载纹理和一次缓冲所有视图纹理之间是否有任何良好的中间OpenGL建议?
答案 0 :(得分:2)
这是拥有纹理缓存并加载720个不同图像的所有最低分辨率MIP级别的地方。这将是您的1x1,2x2左右分辨率图像。
当您检测视图中的更改时,您正在更新纹理缓存,优先使用最后使用的纹理,以便当前在视图中的纹理具有高优先级,而长时间未使用的纹理将具有高优先级优先级最低。
随着纹理优先级的增加,您可以引入纹理的更高细节MIP级别,并且可以在完成加载时重新绑定纹理,纹理缓存会在单独的线程中异步加载它们,然后在它们出现时通知主线程可以准备,因为它需要在与GL上下文相同的线程中发生。
还有一些其他方法可以使用Partially Resident Textures from AMD之类的新扩展来实现此目的,但扩展程序有一些限制,使得使用起来有点麻烦。
答案 1 :(得分:1)
如果旋转平滑且缓慢,您可以根据视图流式传输数据,并为周围视图预取数据。
如果你能负担得起有损压缩,你可以通过积极的压缩将大量数据放入RAM,然后将其中一部分移动到VRAM(如果可能的话,使用DXT / BC压缩)。
你应该查看这些文章:
JMP Van Waveren。实时纹理流和&减压。英特尔 软件网络,2006年。
JMP Van Waveren。地理空间纹理从慢速存储流 设备。英特尔软件网络,2008年。
J.P。 van Waveren。 id tech 5挑战:从纹理虚拟化到 大规模并行化。 SIGGRAPH Talk,2009。