UE4·虚拟纹理

几个相关概念复习

带宽——渲染时数据在显存(实际上也不一定是显存 现在GPU基本都支持DMA)和处理单元之间传输所需要的传输量。

mipmap——会增加缓存命中率,缓解带宽压力(因为读取纹理的尺寸变小了)。缓存命中率的意思是,如果纹理很大,但采样频率却很小的情况下,相邻的两个屏幕像素采样的温宿相差很远,即实际上并不需要采那么多相邻的像素,做了很多无用功即降低了命中率。

图集(texture atlases)——诞生的目的也是为了缓解带宽压力,方便合批降低消耗。缺点在于缺乏wrap modes,如果单块纹理的border不够,就很容易采样到相邻纹理的内容导致视觉bug。

clipmap——virtual mipmap,mipmap的改良形式,解释见下图。

虚拟纹理

虚拟纹理(virtual texture, sparse virtual texture)的概念类似于虚拟内存。地形材质用到的N张巨大的纹理不会被全部加载到内存中,而是根据渲染需要,按照寻址规则从物理纹理上局部加载到内存。

再详细点解释,用传统方法渲染地形,可能会用到N张高精度的纹理,在画面中有任意一角地形出现,都需要完全加载这N张纹理到内存,毫无疑问对带宽和内存的占用是比较大的。

而使用VT,会将整张地形渲染后的纹理信息写入到VT中,然后这张大纹理会被分割为大小相同的N多tile(或者被称为page),然后通过某种映射,将这些page存储到内存中真实存在的一张纹理上,即物理纹理。实际渲染时,视野所到之处的地形会通过索引规则加载对应的page出来。

这一技术的优点在于,减少了带宽消耗和内存/显存消耗,也有利于合批。此外lightmap也可以同样存储到一张VT上。

但是通过这一方法无法渲染透明物体,透明物体依然只能用传统方式渲染。

UE中的VT使用

※ 这次只用了RVT,用于大世界地形

项目设置

至少需要打开enable virtual texture support这个选项。其他选项酌情设置。

创建VT

右键新建Material & Texture → Runtime Virtual Texture。没啥特别要求新建完啥也不改待用就可以了。

设置虚拟体积

Runtime Virtual Texture Volume拖入场景中,设置landscape到volume,将刚才创建的VT拖入volume的VT槽,然后点击set bound按钮设置补获区域。

写入地形材质到VT

参考官方教程运行时虚拟纹理进行材质修改。

在地形材质中使用runtime virtual texture output获得地形材质的输出属性,即可将各项属性写入VT volume使用的VT中。

在材质中使用地形VT

在需要用到VT的材质中创建runtime virtual texture sample,并赋予之前关联地形的VT文件,即可获得地形材质VT的属性。

常见的应用即植被、石头等场景模型与地形进行颜色混合。

参考

  1. 知乎·浅谈Virtual Texture

  2. StackExchange·How can virtual texturing actually be efficient?

  3. Virtual Textures (aka Megatextures) talk (2008)

  4. Crytek·Advanced Virtual Texture Topics

  5. ID Tech 5 中”Megatexture”针对地形的D3D9 基本实现原理