查看原文
其他

虚幻引擎开发者常见问题解决方法:开阔大场景美术制作上效果和效率的平衡

李文磊 虚幻引擎 2020-08-25

在日常的项目开发中,总会遇到各种疑问,一个好的解决方案不仅可以加速工作流程还能够提高项目的运行效率,我们收集了一些国内开发者最常见的问题,请 Epic Games 技术工程师针对这些问题提出解决方案。


今天带来的是由 Epic Games China 开发者美术支持 李文磊制作的《虚幻引擎开发者常见美术问题之一 — 开阔大场景美术制作上效果和效率的平衡》。


开阔大场景美术制作上效果和效率的平衡

在虚幻引擎4项目中,制作开阔大场景需要加载的内容多,渲染的物件过多会对运行效率带来影响。开阔大场景美术制作商如何平衡效率和效果,这是每一个场景美术需要面对的挑战。Epic Games 开发者美术支持 李文磊为大家介绍在制作上平衡场景效果和运行效率的方法。


开阔大场景看的远,加载的内容多,渲染的物件多给视觉和性能之间的平衡带来挑战。


内存

取决于加载内容的多少,主要通过steam level的合理设置。大方向是尽量减小加载的距离,加载地图的数量,以及地图本身包含资源的数量;

  • 为了平衡品质需要有一些技巧。比如使用Proxy的steam level在一定距离先替代真正的level加载进来,减少真正level的加载距离来减小popping的问题;Proxy level可以制作多级,减小中远距离仅加载更低界别的Proxy level来减小被加载的内存开销;高细节小物体可以被作为单独关卡来执行加卸载,减小加载距离;超远距离可一个始终加载和绘制的Massive Level Proxymesh来避免Proxy level被卸载后的留空;Pre-Computedvisibility数据的密度可调整减小内存开销;

  •  地图的加卸载默认有几种方式实现:World Composite相关设置;Level StreamingVolume;Script(Blueprint, 或者代码方式)

 

GPU

  • Vertex(三角面数)开销: 利用culling减少同屏物件数量是首当其冲;一定距离没有被culling掉的物体降低到一定的LOD层级;对于一堆物体也可以制作一个LOD即HLOD。另外也可以通过Detailmode来toggle物体的是否在特定情况下绘制。

  • 效果上需要最小化culling以及LOD切换带来的视觉上的不连续或者突变;可以在材质上做culling和LOD切换时的材质动画来平滑过度。对于影响游戏的物件很少被直接culling掉,更多的优化来自LOD的切换带来的效益,尤其是HLOD带来的收益是巨大的(不仅仅是三角面的优化)。减小HLOD(LOD)和basemesh的差异除了模型轮廓线的保持;材质中高光(粗糙度)前后的一致性也影响很大

  • 灯光:动态shadow优化策略是减少阴影可见的距离;减小投影物体的面数,这个比较容易被忽略,也是制作模型LOD带来的另一个好处;当然阴影的品质肯定也影响效率,可根据效果平衡

  • 动态物体在静态物体下的影子默认不计算,可以通过Enable single shadow fromstationary light开启利用间接光缓存中存储的遮蔽信息来遮蔽动态角色等;但前提是需要build lightmass,这不适合全动态灯光环境

  • 动态点光注意设置Max Draw Distance

  • 材质:材质中贴图的大小,采样的数量以及Instruction的数量都是因素。利用MaterialQualitySwitch在不同性能设备上做适配。材质LOD的实现方式目前通过对LOD模型应用简化后的材质实现;草的开销模型尽量贴合非透明像素区域,LOD减少层叠数量加大面来减少overdraw;当心大量mask(比如草)cast动态CSM的开销

 

CPU(Render)

  • Drawcall影响因素有物件的数量,材质的数量,动态投影物件的数量

  • 效能最大的优化来自HLOD;LOD减小材质ID; 减小动态投影距离从而减小动态投影物件数量

  • 4.20后Merge Actor除了可以合成单个Mesh,也提供了合并多同类型的静态模型Actor为Instance StaticmeshActor功能

 

包体大小

  • 地图大东西多外,还来自为了以上优化而增加的资源,如HLOD, Proxy levels, LOD, 静态lightmap, ILC/Volumetriclightmap

  • 重用资源是首要考虑的,大地图不代表资源数量大,种类多。通过组合,改变材质参数,改变尺寸和方向等组合变化减少资源种类数量

  • 有可能的话使用Static Directionallight减少生成Shadowmap

  • 考虑Foliage(植被)动态,不使用lightmap

  • 草如果是Grass type可以采样地形的lightmap,避免单独再生成

  • 考虑使用全动态灯光; 如果使用Distance AmbilentOcclusion, r.AOGlobalDFStartDistance对DistanceAO的品质影响大,默认100,调大数值增加AO品质和开销

 

关于地形

  • 地形开销主要来自三角面数开销,材质绘制,Drawcall以及如何平衡彼此

  • 首先是Culling, 看不到的直接cull掉是最有效的减小三角面方式,cull的基本单位是地形Component,因此Component越大越不容易被Cull掉,但小了也带来Drawcall数量增加问题

  • 同样大小的地形,网格的密度决定总的三角面数量,可适当调整(默认100单位一格);单个Component网格密度可以通过LODbias来调整,根据美术需求可在特别平坦或需要细节山体轮廓线的Component地形上应用单独控制的LODbias来平衡视觉和效率。LOD的切换的距离factor也可以做调整,基于效果不断做平衡

  • 同屏Sections的数量决定了Drawcall的数量;Section可以包含不同数量的网格,同样大小的地形每个Section包含的网格越多,就可以用越少的Section来组成,但Section少了Component的数量也相对减少,使得每个Component变得很大,三角面无法做很好的culling

  • MassiveLevel Proxy Mesh可以通过塌陷顶点的方式实现隐藏相应区域的面,信息来自相应的Vertex color Index和当前Showed的关卡



材质

  • 目前地形并没有材质复杂度的限制;4.20前手机上单个Component上最多支持3层限制(4.20后无限制)

  • 目前不支持地形LOD材质(理论上可以给远处玩家无法走到区域付给简化材质)。所以尽量减小基础材质的开销(材质优化同上)

  • 移动端同时也局限于贴图采样数量(ES3 16 Samples)

  • 材质应用的单位是Component,应用于整个地形的材质再复杂只要单个Component上未超出材质贴图的局限即可;这可以通过控制单个Component上图层混合绘制数量来实现,引擎可自动优化掉未被显示的图层;单个Component也可应用完全不同材质

 

为层之间的混合(Mask)增加细节(Splatting)可以极大提高混合效果的丰富度


地形材质变化除了可以通过增加图层来实现,还可以通过在同一地形图层内做材质上的变化


色彩映射贴图:虚幻引擎4.20 以后材质支持使用 CurveAtlas 贴图,使得修改更加方便。


植被

  • 使用Procudural foliage tools来程序生成树木以节省手动摆放的时间

  • 可以使用PerInstancefadeAmount材质节点来控制植被被culling时的视觉表现


  • 用PerInstanceRandom增加植被材质的丰富性


同上类似地形材质的变化,使用色彩映射贴图


  • Impostor:使用材质和简单cardboard模型来模拟实体模型各个角度渲染的方式


引擎提供了 Render 模型到 Impostor 贴图的 BP 工具 RenderToTexture(在虚幻引擎官方文档中用关键词“ RenderToTexture” 进行搜索相关页面。)

另外,Epic Games TA Ryan Brucks 也为此贴了篇博客,并提供了相应的工具,点击文章尾部 “阅读原文” 跳转到 Ryan Brucks 的博客。 






近期焦点




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存