OpenGL纹理加速-视图相关纹理

OpenGL Texture Speed up - View Dependent Textures

本文关键字:纹理 视图 加速 OpenGL      更新时间:2023-10-16

我有一个对象类型,它根据旋转(模拟3D)将纹理(正确地)渲染到2D网格上。然而,为每个视图加载/绑定新纹理图像的速度相当慢。禁用依赖于视图的纹理加载会导致非常快速的性能。

缓冲对象的所有视图/纹理可能不是一个好的选择,它可能包含大约720个视图(单独的图像),每个视图可能是600x1000像素。也不能保证最终用户的系统规格,这是一个外围应用程序。

在按需加载纹理和一次缓冲所有视图纹理之间,OpenGL有什么好的中间建议吗?

这是有纹理缓存的地方,可以加载720个不同图像的所有最低分辨率MIP级别。这将是你的1x1,2x2等分辨率的图像。

当您检测到视图中的更改时,您正在更新纹理缓存,对上次使用的纹理进行优先级排序,以便当前视图中的纹理具有较高的优先级,而长期未使用的纹理具有最低的优先级。

随着纹理优先级的增加,您将引入纹理的更高细节MIP级别,并且您可以在纹理完成加载时重新绑定纹理,纹理缓存将在单独的线程中异步加载它们,然后通知您的主线程何时可以准备它们,因为这需要在与GL上下文相同的线程中进行。

使用AMD的Partially Resident Textures等新扩展还有一些其他方法可以做到这一点,但该扩展有一些局限性,使用起来有点麻烦。

如果旋转平稳且缓慢,则可以根据视图从磁盘流式传输数据,并为周围视图预取数据。

如果你能承受有损压缩,你可以用激进的压缩将大量数据放在RAM中,然后将其中一些数据移动到VRAM(如果可能的话,使用DXT/BC压缩)。

你应该检查这些文章:

JMP Van Waveren。实时纹理流&减压。英特尔软件网络,2006年。

JMP Van Waveren。来自慢速存储的地理空间纹理流设备。英特尔软件网络,2008年。

J。P.van Waveren。id-tech 5大挑战:从纹理虚拟化到大规模并行化。SIGGRAPH演讲,2009年。