UE4·虚拟纹理
1 min to read
几个相关概念复习
带宽——渲染时数据在显存(实际上也不一定是显存 现在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的属性。
常见的应用即植被、石头等场景模型与地形进行颜色混合。