123 发表于 2020-11-25 09:28

Unreal-Tick_VirtualTexture

做地形材质的时候为了更多的细节往往不会直接在外部DCC里面去Bake一个Terrain大图,而是直接在引擎里面用各种检测算法比如Slop去智能的根据地形外貌进行上色。如图。
而这样做虽然效果好迭代也快但是对于资源的消耗也是很高的,毕竟每帧都要读N张贴图去进行各种复杂的叠加混合。于是先猿变想了一种降低此过程效果的东西,那便是VirtuaTexture(简称VT)。对于VT最早是又Doom的马克聚聚领衔主导的。这个版本的VT做法大概如下。
第一步就是把导入的贴图(JPEG, TGA, PNG)进行切割得到PageTexture(既全部PageTexture合在一起交VirtualTexture),比如1024*1024的贴图切四份然后存在磁盘里(Mip也随着一起切)。
第二步用一个FeadBackPass计算当前表面可见的PageID和MipLevel并将结果写入FeadBackRT,然后用这个信息去Load对应的PageTexture并加载到PhysicsTexture,并将PageTexture在VirtualTexture的位置和其写入到PhysicsTexture位置的对应关系写入到一个IndirectTexture。
第三步材质里面把挂在网格的UV转到VT的UV下并通过IndirecTexture找到它在PhyscisTexture上的位置并采样输出。
这种方法在UE里面貌似叫Static Virtual Texture。使用时只需把贴图的属性里面勾上VirtualTextureStreaming然后和以往的贴图一样用就行,剩下的细节由UE自己处理。
开启加载VT
和普通贴图一样用法这里就简单混合一个ZMask
在控制台输入r.VT.Borders 1和r.VT.Flush 1可开启StaticVT的Debug可视化。这种方法感觉比较适合StaticMesh这种Primitive,在地形上估计没有啥质的提升。
所以地形上后来又出现了Procedural Virtual Texture。这个和StaticVT主要区别是Dynamic和Procedural。对于Dynamic来说加载的贴图并不会事先对它切割成Page而是直接根据情况加载整张贴图到PhysicsTexture。对于Procedural因为能做到实时加载,实时卸载,实时合并那么自然而然的就能够完美支持各种ProceduralTexture的绘制。可以参考麦老师的MVT。
这个东西在UE里面对应的是RuntimeVT。用法首先得新建一个VT资源,这里面可以选择它的一些属性比如Size和TileSize,BoradSize之类的东西以及这个VT是只存成Color还是Color和Normal都存之类的。
然后材质里面和往常做智能材质一样拿贴图进来用(这部分就代表着Procdural),然后结果不直接输出在材质的Pin上而是输出在VTOutput,再在输出的Pin上接入VTSampler节点里放好创建的VTAsset以及对应的属性。
接入的数据和往常做地形材质一样,用程序化的模式去构建地形外貌。
然后地形上加好这个材质并在其VT属性栏里放入和材质里面一样的VTAsset,并拖拽一个VTBox罩住某个区域其属性的VTAsset也要一一对应。
随后就完成了RuntimeVT的应用。因为Procedural的内容只是操作了一次并把结果写入VT然后地形采样VT来得到颜色等数据所以对比以前的ProceduralMaterial倒是加强了不少运行时的运算性能。像这儿实验用的材质在不用VT之前都是红的。
    而RuntimeVT的另一个Procedural功能便是VTDecal,像幽灵行动就是满地的Decal来做细节效果。在UE里面并不直接支持Decal去操作这种内容而是用了一种类似MeshDecal的操作。首先材质里面需要将MaterialDomain切换到VirtualTexture然后和以往做模型材质一样即可。随后场景地形上放一个BoxMesh并赋予VT材质,设置好VT参数便能得到下图效果。扩展一下可以直接吧SplineRoad的材质换成VT贴上去。
有了VT自然而然的做TerrainBlend就会很轻松直接物体采样VT然后算个Mask混合一下即可,比如SDFMask或者自己捕捉一个TerrainPos去采样用模型自身Pos比较得到Mask,我这儿就不整那么复杂了。
总体试了一下倒是还蛮不错的特别是RuntimeVT。不过也有一些不足,比如一个地形材质只能放一个VT支持如果大地形不想VT精度很低,得做严格的做TileLandscape并每个Tile制定一个材质和VTAsset和VTVolume,这对流程会更具有规范性,倒也是好事至少能挡一些奇怪的美术操作。等后续Release吧。ennm,intresting。
页: [1]
查看完整版本: Unreal-Tick_VirtualTexture