DomDomm 发表于 2022-6-21 09:02

Virtual Texture(虚拟纹理)的理解和应用 | Epic 李文磊(笔记)

笔记来源:https://www.bilibili.com/video/BV1KK411L7Rg
<hr/>内容总览

Streaming Virtual Texture (SVT)

[*]普通贴图变成虚拟纹理
[*]查看SVT mipmap等级混合状态命令
[*]SVT主要应用和优点:(1)均一化贴图内存的占用(2)突破分辨率限制和提高纹理精度
[*]多象限UV使用要求
[*]SVT的主要开销

Run Time Virtual Texture (RVT)

[*]RVT主要应用和简单操作步骤(优点:catch复杂材质,降低材质复杂度,加快效率)
[*]物体之间材质交互
[*]解决草模型的悬浮问题
[*]RVT优化
<hr/>

[*]UE4 4.23开始有了,4.24改进优化run time 的虚拟纹理,4.25对手机进行了支持。
[*]有两种,Streaming Virtual Texture (SVT),Run Time Virtual Texture (RVT)
在UE4的项目设置中打开Virtual Texture,如下:



需要手机支持的话,打开on mobile,要注意的是:光照贴图是否支持虚拟纹理默认是打开的。

Streaming Virtual Texture (SVT)


[*]和普通贴图差别主要在加载方式;
[*]普通贴图:加载根据摄像机和对象的距离,对象的UV在屏幕上的变化速度。
[*]SVT:把贴图分成不同的 Tile / Page ,默认是128*128 Page ,根据是否在屏幕上或者是否渲染是否看得见,来决定哪些 Page 需要被加载。



在PageTable中需要被加载的是灰色的,不需要被加载的是白色的,最终会被加载的是PhysicalTex里面的

普通贴图变成虚拟纹理:

(1) 在贴图的细节面板中的Virtual Texture Streaming勾上,贴图缩略图的右下角会出现VT。见下图:




(2) 右键贴图,选择Convert to Virtual Texture :


(3) 要注意的是: 在用到该贴图的材质中把采样方式 Sampler Type 改成 Virtual Color,材质加载方式正确就不会报错:


(4)SVT mipmap的混合用了一个随机的三线性过滤加载(下图中左边),打开TemporalAA效果可能会好一些,避免闪烁。





打开TemporalAA

查看SVT mipmap等级混合状态命令

r.vt.borders 1 和 r.VT.Flush




白色网格表示当前使用 0级mipmap,黄色网格 1级,蓝色绿色等等。


输入命令:stat virtualtexturing,可获取信息框:


上图中其中page相当于tile,可视的page数量为16,是和白色格子数量匹配的。

SVT主要应用:


[*]情况一:为了省drawcall,然后把很多贴图合并在一起,比如建筑的门窗合并在一起,贴图纹理就会不够高清,贴图中看不见的tile部分也会被加载进来。
[*]情况二:对范围比较小但是细节比较多的环境,贴图会一股脑调进来,然后内存就爆炸了。
[*]情况三:lightmap,植被的光照贴图会最终合批到一张4096的光照贴图里,要是你始终只看一小片植被,SVT就可以同时解决合批和内存加载的效率问题。在项目设置里面把lightmap作为SVT选项勾上。
[*]SVT优点一: 节省内存,把合并贴图转换成SVT就可以,均一化贴图内存的占用。
[*]SVT优点二: 突破分辨率限制和提高纹理精度,合并贴图到一定的程度是由分辨率限制的,东西太大或者是有精度要求时。
多象限UV使用要求:




[*]通过扩展名来定义它在哪个位置,在模型上面需要做好准备来匹配采样哪个象限,导入后转换成SVT。
[*]避免了整张贴图一起被加载进来;
[*]突破了合并贴图到一定象限后无法被支持的瓶颈,并且过大贴图加载方式上对内存的不友好;

问题答复:

(1)SVT的主要开销在采样上,贴图采样器的数量 texture lookups,和stacks数量,影响到效率。两张贴图采样器的话, texture lookups=2,两张图共用一个TexCoord的话texture stacks=1,用各自的UV则会变成texture stacks=2.


<hr/>Run Time Virtual Texture (RVT)


[*]加载方式和SVT类似,都是以tile方式加载。
[*]SVT作为asset是存在硬盘上的;RVT是当你在Run Time时会进行一个生成和渲染。
[*]开销的点不一样。
RVT主要应用和简单操作步骤

catch复杂材质,降低地形材质复杂度,加快效率。
例如地形材质,操作步骤:
(1)Run Time Virtual Texture Volume:决定了大小方向,往哪里拍,相当于相机


(2)Run Time Virtual Texture:创建Run Time Virtual Texture,相当于照相机底片


(3)把底片Run Time Virtual Texture放入Run Time Virtual Texture Volume也就是相机里


(4)被拍到的东西需要进行一个设置,actor层级上,模型需要在细节面板定义被拍到哪个Run Time Virtual Texture底片里头。


材质层级第一种,被拍摄到的物体材质的domain设置:


材质层级第二种,材质材质的domain为surface情况下使用:


(5)右为采样节点左为被采样的Run Time Virtual Texture底片,可以同时输出和采样


出现渲染次序问题可以在被拍模型的细节属性里面调整渲染优先级



[*]编辑器里移动可以实时更新,游戏里是不可以的。
物体之间材质交互


[*]树的假阴影,地面上的物体影响地面下的物体示例,见视频52:35处。(例如树周围的土壤突起和阴影,以及石头放在雪地和沙地的效果)



树周围的土壤通过法线突起和渲染到VT的阴影



石头模型放在雪地和沙地的效果


[*]4.24对RVT的优化,可以在Run Time Virtual Texture修改多远处使用SVT.(需要在指定层级,然后在编辑器build SVT)



输出的是当前VT的mip的值,可以解决基于视距的lerp效果视频64:50处

解决草模型的悬浮问题

拍下地面的高度,然后在草的材质里面去采样它,让草能够贴地。
贴着地浮动的云,水流和粒子效果等。
有了高度的信息,物体和地面交界的地方可以做一个遮罩,blend基础色和法线,解决生硬接缝的问题。



草模型的悬浮问题



blend基础色和法线

草贴地的实现



利用地面高度和物体轴心比较

trick: object position是一个bounce的轴心,草默认bounce的轴心Z轴为26,我们在Z轴下移26,即可把轴心放到草的底部。




同一个材质可以采样多张也可以写入多张。

RVT优化(减少数量和被拍物体的复杂度):


[*]材质上减少数量,可以在Run Time Virtual Texture修改多远处使用SVT.(需要在指定层级,然后在编辑器build SVT)



[*]actor上,通过lod bias和skip mips以及覆盖度来减少数量,和被拍物体的复杂度



[*]在不同平台设置不同的VT尺寸:



RVT属性界面打开允许缩放



再输入这个命令

Arzie100 发表于 2022-6-21 09:04

请问是B站哪一个视频啊

Mecanim 发表于 2022-6-21 09:13

文章给了链接,或者搜题目关键字就可以。

Arzie100 发表于 2022-6-21 09:22

b站unreal官方的账号下面有

DungDaj 发表于 2022-6-21 09:27

目前手机端不足有哪些呢,比如RVT不支持压缩

maltadirk 发表于 2022-6-21 09:28

没有在做手机端的,不太了解哦。

ainatipen 发表于 2022-6-21 09:33

大佬,material domain 里面没有virtual texture选项是什么原因呢?
项目设置里都开启了

kyuskoj 发表于 2022-6-21 09:38

有没有一种可能在ppv里用运行时rvt?[惊喜]
页: [1]
查看完整版本: Virtual Texture(虚拟纹理)的理解和应用 | Epic 李文磊(笔记)