Sparse Virtual Texture (虚拟贴图技术)

Virtual texture 技术用于解决3D场景中大量贴图而内存有限的情况,它的思想可以参考虚拟内存。

虚拟内存技术中,物理内存是有限的,但是虚拟内存可以远远大于物理内存,虚拟内存被抽象成一个个page即分页文件,page可以真实的载入到物理内存中,也可以存在与磁盘文件上,寻址时采用的内存地址采用一个表来映射到具体的的内存位置,如果映射到物理内存里,即hit,如果在磁盘的page上,将其载入物理内存,对于当前不使用的内存可能会被保存回磁盘。

        虚拟贴图技术同样,它的基本思想是这样的:

        所有程序用到的贴图会程序处理被pack到几张非常大的虚拟贴图上,模型的uv也被转为虚拟贴图上的uv,这些虚拟贴图尺寸通常非常大,无法全部载入内存。每个虚拟贴图会被划分为很多n*n的小块,每个小块称为一个page文件存在磁盘上, 虚拟贴图会对应一张indirection texture,这张图是载入内存的,indirection texture上存储了每个虚拟贴图的每个page块位置所对应到的真实贴图(或物理贴图)的位置。

       真实贴图最开始可能是空的,当当前画面需要访问某个虚拟贴图上的某个page的时候,通过indirection texture找到它在物理贴图上的位置,如果物理贴图上不存在,就查找到它对应的磁盘上的page文件,将其载入物理贴图的对应区域。shader在渲染的时候,结合indirection texture去访问物理贴图来采样。上面的这个虚拟贴图,indirection map ,物理贴图之间的关系如下Sparse Virtual Texture (虚拟贴图技术)_第1张图片


     这里面还存在一些问题,首先如何知道需要load到物理内存里哪些page,通常的做法是预先用一个很简单的shader先渲染一遍,将场景物件的page id渲染到rt上,然后load那些page。程序通常可以通过当前需要渲染的page id对应到虚拟贴图的uv,再转换到indirection texture的坐标上。

     此外对于虚拟贴图也要处理mipmap,对于虚拟贴图也同时存在它的多个mipmap的虚拟贴图和indirection  texture。load 物理贴图的时候同时要load 这些mipmap。

Sparse Virtual Texture (虚拟贴图技术)_第2张图片

    虚拟贴图减少了内存占用,但是对于io是一个挑战,尤其在快速转动视角,飞行等快速切换渲染物体的情况下,很多时候加载贴图的时间会成为瓶颈,这是在实现中一个很大的问题。一些优化方法包括每次对page优先加载mipmap最低一层的,最后加载高层的,这样当所需的mip没有加载好的时候,可以向使用最低的那个mipmap,然后待加载好之后再展示细节更高的。




这里有一些参考资料

cryengine4在大terrain上使用的虚拟贴图策略,gdc2015的文章 

http://twvideo01.ubm-us.net/o1/vault/gdc2015/presentations/Chen_Ka_AdaptiveVirtualTexture.pdf

几个paper

https://silverspaceship.com/src/svt/

http://www.mrelusive.com/publications/papers/Software-Virtual-Textures.pdf


你可能感兴趣的:(游戏开发-客户端)