引言

之前在用UE5做地编的时候,遇到一个最大的问题就是地形开销太大,不仅在运行时很卡,编辑地形的时候也会经常死机。后来了解了下虚拟纹理的技术,认为这个是地编流程里必不可少的一环,所以本节来记录一下虚拟纹理相关的一些事宜。

一、虚拟纹理技术概览

首先要了解到,虚拟纹理本质上是为了降低贴图开销和内存占用的技术。在虚拟纹理诞生之前,也有很多降低内存开销的解决方案,最为熟知的就是LOD技术,其原理是根据距离的远近选择加载的纹理尺寸;而后也诞生了Virtual Mipmap技术,其原理是只加载视野当中所涉及到的mipmap部分,而超出视野范围的就会被裁剪掉。

后来,id Software便正式提出了虚拟纹理的概念。之所以取名“虚拟”,灵感其实来自于虚拟内存,即不会将完整的信息全部加载到内存中,而是根据实际需求,碎片化地加载一部分必要的信息。具体的操作方式是将纹理的mipmap chain分割曾相同大小的区块,然后通过定义的映射算法,映射到一张内存中已经存在的物理纹理,那么当相机视野发生改变时,只需要替换掉部分物理纹理即可,这样就降低了带宽消耗和显存开销。另外,由于虚拟纹理已经不再是以一整张纹理作为单位了,因此合批加载纹理也更加自由。

如上图所示,其纹理的储存方式 和计算机组成原理中学习的虚拟内存几乎是一个路子,都是将一段完整的信息切碎存储到物理空间中,然后给予虚拟地址与物理地址一一映射,这样就能通过虚拟地址还原出完整的物理信息。

既然现在已经将纹理切碎存储了,那么下一个问题就是:如何确定我们需要加载哪些碎片(即page)?这里就需要单独渲染一个pass,叫做Feedback Rendering。在延迟渲染中,我们会将相机能看到的所有片元的颜色、法线、uv等信息全部存储到G-buffer中,而Feedback Rendering就是预先将每个片元对应纹理的page信息写入G-buffer,然后在下一个pass正是渲染的时候,根据G-buffer的page信息来决定要加载哪些page。这样实际的纹理加载量一定小于一整张完整纹理的加载量,从而起到了节省内存的效果: