解放双手变魔术,Epic戴浩军:虚幻引擎如何程序化造山挖湖种树?

程序化自然环境编辑流程的核心意义,在于对项目的流程梳理和工具开发、运用自动化的方式完成重复度较高的工作,同时保留足够的灵活度,来应对各种定制化需求。

【GameLook专稿,转载请注明出处】

GameLook报道/11月27日,一年一度的2020虚幻引擎技术开放日(Unreal Open Day Online)正式召开。此次活动采取线上形式在全球范围内直播,多名来自Epic Games,以及完美世界、祖龙娱乐、心动网络、龙渊网络的技术专家进行了分享。

其中,Epic Games技术美术戴浩军,以《程序化自然环境编辑案例解析》为主题,通过介绍虚幻引擎4功能,并结合案例分析的形式,深入浅出地分析了程序化自然环境制作的优势、意义以及具体方法。

同时他还对高品质美术项目的性能优化提出了自己的见解,鼓励开发者借助虚幻引擎工具和功能,针对项目具体需求,建立起一套科学灵活、可操作性强、结果可逆的优化方案,减少性能问题的束缚,提高项目开发效率。

以下为分享实录:

大家好!我叫戴浩军,是Epic Games的一名技术美术,我的日常工作是为广大的虚幻引擎开发者提供技术美术方向的支持。今天我分享的话题是程序化自然环境编辑案例解析。

本话题共分为三部分:

  • 程序化自然环境制作流程的意义和目标;
  • 虚幻引擎目前内置的程序化工具和方法;
  • 通过一个简单案例解析来展示综合运用引擎工具和特性,进行程序化自然环境制作的思路。

程序化自然环境制作流程的意义和目标

我们在使用虚幻引擎编辑室外自然场景,尤其是大面积场景时,经常会遇到美术效果、运行性能、编辑效率、编辑灵活度和沟通成本这五个目标之间的矛盾。而程序化自然环境编辑流程的核心意义,在于对项目的流程梳理和工具开发、运用自动化的方式完成重复度较高的工作,同时保留足够的灵活度,来应对各种定制化需求,达到上述五点目标之间的平衡。

虚幻引擎目前内置的程序化工具和方法

为此,我们需要以下几个方面的工具和方法:

  • 流程解耦——即将自然环境编辑工作拆分为整理美术素材资产、搭建材质系统、、制作地形地貌、分布地表植被、构建生态、运用光影和后处理、优化性能等多个独立环节。并通过一系列自动化工具进行整合。
  • 自动化处理——即通过针对项目需求编写工具来自动完成各类重复工作,同时确保美术效果相关的数据在各环节统一可控。并通过直观的界面封装相关信息,将沟通成本降到最低。
  • 非破坏性编辑——即尽可能保留自然环境编辑的过程,允许场景设计师较为灵活地修改或还原阶段成果,同时也便于在同一个环节进行多人协作。
  • 兼容定制化编辑——即在自动化基础上仍然能够兼容手动编辑方式,不会因为自动化流程而限制定制化需求。

最终我们希望实现的是,通过结合各类工具和方法,形成符合项目需求的自然环境编辑工作流程,为场景设计师带来更好的开发体验。

下面我们一起来看一下,虚幻引擎在近期提供了哪些内置的工具和特性,能够帮助我们实现以上目标。

首先是Landscape Edit Layers(地形编辑层功能),在4.24版本引入。核心作用是允许我们通过分层方式编辑地形,将基础地形、人工编辑地形、笔刷地形等编辑工作解耦,能够把同一个地形不同区域或不同迭代阶段的高度信息、地表材质层权重信息,拆分到不同的编辑层,并可实时预览最终效果。可随时添加、隐藏、修改、排序或删除编辑层。

性能方面,该功能仅增加了编辑器中的性能消耗,在运行时没有额外消耗。相对于普通编辑方式,使用地形编辑层既可以使我们灵活地保留地形编辑工作的中间过程,以便快速迭代,同时也便于将大量地形编辑工作拆分后进行多人协作,并重新组合。经过合理的流程划分和组织,可以使地形编辑中不同环节或不同岗位之间的工作互不干扰,同时又能随时预览整合后的效果。

然后是Landmass Blueprint Brush(地形笔刷蓝图功能),同样在UE4.24版本中引入,包含在Landmass插件中。可以让我们通过带有样条线的蓝图笔刷生成局部地形,并与基础地形进行融合,可分别影响高度图和权重图,便于对局部地形进行迭代。

通过在地形上添加笔刷,调整笔刷的曲线和属性,可以很方便的得到类似山脉、湖泊、河流等局部自然地形,并且可以随时修改、隐藏或删除。即使没有划分到独立的地形层,也不会破坏原有地形。

此外,我们可以根据项目需求扩展笔刷蓝图,形成各类具有定制化效果和功能的笔刷工具,方便场景设计师快速调用。

然后是Procedural Foliage Tool(程序化植被生成工具)。可以帮助我们按照预先定义的生态规则,在地形上批量生成植被。

在此基础上,我们可以把整个地形生态拆分为三部分:

  1. 地表草类植被(Grass Type),根据分布规则自动生成或用笔刷手动绘制的生态植被;
  2. 植被类型(Foliage Type);
  3. 以及与生态分布规则紧密相关的动物自然现象的Actor植被(Actor Foliage),将地形植被工作进行解耦。

我们可以在各类植被的植被类型中设置其生态分布规则,例如分布密度、碰撞、阴影、种子间距、种子年龄、互斥优先级、限定或排除地表材质层等。然后将一组植被类型指定到一个程序化植被生成器中,即可根据规则批量生成生态植被。

同时我们也可以在特定区域添加Procedural Foliage Blocking Volume程序化植被阻挡体积,来阻止植被在该区域出生。

下一个是Actor Foilage,这是在虚幻引擎4.23版本中引入的新功能,允许我们使用植被笔刷工具,或者程序化植被生成器来批量生成各类Actor对象。

我们可以将某些与生态分布密切相关的环境元素,例如动物、环境粒子特效、非静态模型演示等,指定到植被类型中。通过程序化植被生成器与静态模型植被一起,根据预定规则自动分布。

批量生成的Actor植被具备场景中普通Actor的功能和消耗,我们可以在Actor植被蓝图中包含各类组件,来实现定制化的表现。也可以编写各类功能,来提高自动化程度。同时为了避免大量Actor所带来的消耗,我们也可以在Actor中编写自定义的规则来优化性能。

然后是Editor Script Blueprints(编辑器脚本蓝图)和Python脚本API,允许开发者使用蓝图工具或Python脚本编写功能,来扩展虚幻引擎编辑器。通过资产、场景、编辑器设置等各类API,实现例如资产批处理,场景对象批处理等定制化功能。方便项目人员自行扩展编辑器,而不需要制作插件或修改编辑器代码。

通过使用编辑器脚本蓝图,我们可以灵活定制各类编辑器扩展功能,引擎将根据功能类别将函数名自动添加到,资源管理器或者场景主视口的右键菜单中。我们也可以通过Python脚本在调用Unreal API的同时读写外部信息,例如资产信息、项目管理信息等。

然后是Editor Utility Widgets(编辑器工具控件)。和编辑器脚本蓝图一样,可以编写资产和场景对象批处理等脚本功能。并且在此基础上为我们提供了一套基于UMG的UI方案,我们可以用UMG编辑器,很方便的为我们的脚本工具设计统一的UI界面,提升项目流程完整性、降低各环节沟通成本。

例如,我们可以通过编辑器工具控件,将自然环境编辑工作中所需众多选项和数据,集成到一个统一的界面中。将项目所需流程进行拆分,使每个岗位只看到自己所关心的信息,并可以通过编写功能自动校验、修复信息,避免误操作导致的效果差异,以此确保最终效果在不同环节不同基础的人员之间统一可控。

此外,我们也可以用Python脚本编写具体功能,在编辑器工具控件中调用,将脚本功能和UI界面再次解耦。

然后是 Sky Atmosphere (天空大气)和Sun Positioner(太阳定位器)。天空大气是UE4.25版本引入的功能,能够基于物理参数得到真实的天空和大气渲染效果,并且可以方便地预览太阳在各方向,甚至是从地面到外太空过渡过程中的天空和大气效果。

太阳定位器是包含在太阳位置计算器(Sun Position Calculator)插件中的功能,可以帮助我们通过地理经纬度、时区、日期和时间等数据,来自动计算太阳位置和阳光角度。将两者结合,即可通过少量可控的参数,来得到真实的、基于地理位置和物理参数的天空和大气效果,在编辑器和运行时均可控制,便于我们在游戏项目中制作,例如动态日夜变换等效果。

通过这种方式,我们将之前具象化的天空大气和方向光效果,抽象成地理位置、时间和大气物理参数等数据,大大提升了信息沟通效率,提高了相关效果的可控度。

然后是UE4.24版本引入的Runtime Virtual Texture(运行时虚拟纹理功能),能够基于GPU动态创建纹理元素数据。通过虚拟纹理资产,将场景中的地形或其他Actor的实时渲染图像,与其他物体的材质进行连接,大大提高了制作地面贴花、模型底部与地面融合效果、地面物体与地形材质交互效果,等程序化材质效果的便利性和运行时性能。

例如,通过基于运行时虚拟纹理的程序化材质制作方式,我们可以更方便地制作静态模型与地形材质自动融合的效果,而不需要在制作模型材质的时候,考虑模型实际位置的地形纹理。通过虚拟纹理资产,实时将地形材质的渲染结果,以纹理的形式传递给所有需要用到的其他材质。并且允许场景中的多个对象共同更新同一个虚拟纹理,大大提升了程序化材质制作的灵活度。

最后是在UE4.26版本默认开启的Material Layers(材质层功能)。该功能允许我们通过材质层、材质混合等资产,搭建更为灵活的分层材质体系。相对于基于材质函数的分层材质方案,大大提升了灵活度和便利度。

针对具体模型的材质实例,可以不再依赖复材质的内部结构,而是可以针对每个具体的材质实例,灵活添加材质层和材质混合,形成较为彻底的组合式的材质结构。

由于材质层和材质混合资产都能够实例化,形成多层级的材质层实例资产和材质混合实例资产,并且其中的参数可以在各层级资产中调整并保留,在具体应用的材质实例中可以进行覆盖修改,因此可以获得极高的灵活度。

我们可以把材质层和材质混合视为能够多级实例化,并且能够在材质实例中灵活组合的材质函数.在设计基于材质层的材质体系时,我们可以根据项目需求将最基础的材质元素进行拆分、提炼,并形成统一数据。例如具体到某一种物质的基础色、粗糙度、金属度、细节法线贴图和平铺(Tiling)值等基本属性和效果,并通过具体模型对应该物质的遮罩(Mask)进行混合。

通过这种方式,既可以保证整个项目中某一种物质的基本属性和效果统一可控,同时也可以通过各种小尺寸贴图重复平铺(Tiling)后,通过表面混合来表现材质细节,避免为了细节表现而使用大量大尺寸贴图,减少了编辑、运行时的贴图内存占用,和整个项目的贴图资源总量,真正形成一套程序化的分层材质体系。

案例解析展示程序化自然环境制作的思路

那么我们如何充分发挥上述引擎提供的程序化功能所带来的优势,来建立符合项目需求的制作流程?该流程又能为自然环境场景编辑带来哪些帮助?

下面我们用一个简单的案例,来快速展示一下上述引擎工具和特性,为程序化制作自然环境带来了哪些流程上的改变?希望能给大家带来一些启发。

本案例基于UE4.25.4启动器(Launcher)版本纯蓝图工程,考虑性能分级,其中使用到的绝大部分素材来自于Quixel Megascans 3D扫描素材库,在场景设计师开始介入地形编辑工作之前,我们需要先做一些准备工作。

首先,我们用Epic的账号登录Megascans Bridge软件,免费下载项目所需地表纹理、3D模型、3D植被跟素材,并通过Megascans UE4 插件快速导入,插件会根据材质模板帮我们自动生成每个模型的材质实例,并指定给模型资产。由于项目需求不同,我们往往需要定制一些资产处理方面的策略,来解决例如资产优化设置、表现统一、风格化处理相关的问题。

凭借引擎的编辑器脚本和Python API,我们可以很方便的组织策略,编写资产批处理工具,读取针对项目需求设计的参数预设,方便设计师批量优化和处理资产。然后我们可以针对项目需要建立材质框架,通过材质层资产,抽象出各种物质的基本材质属性;通过材质混合资产,定义各材质层的混合方式,并建立基础材质。然后针对各类模型资产建立材质实例模板,创建子材质实例,并指定给模型资产。

通过这种程序化材质组织方式,能够为后续可能的材质效果迭代带来很大的便利性。

接下来添加虚拟纹理相关资产.例如运行时虚拟纹理资产、运行时虚拟纹理体积,并为有需要的材质添加虚拟纹理输出材质节点、虚拟纹理采样材质节点等,并为需要输出到虚拟纹理的Actor对象指定虚纹理资产的引用。

建立光照模板关卡、添加并设置天空大气、太阳定位器以及其他灯光后处理体积等。在关注灯光效果的同时,我们也需要根据项目需求设置光照相关性能分级预设,供场景美术预览整体效果使用。

使用编辑器脚本调用太阳定位器相关参数,并通过编辑器工具控件直观地呈现在引擎编辑器界面上。

建立项目所需要的地形材质、地形草、植被类型和Foliage Type植被类型资产。根据项目性能分级要求设置密度,剔除距离等参数。并根据植被特点设置分布式的随机旋转、海拔高度区间、可出生坡度、限定地表层或排除地表层,碰撞范围、阴影范围、播种、生长、等相关参数,然后将上述资产分别指定到地形材质和程序化植被生成器中。

同时在很多项目的自然环境编辑过程中,场景设计师在享受程序化编辑流程带来的便利的同时,也不希望美术设计自由度受到自动化流程的限制。比如很多时候,场景设计师需要对场景的特定区域植被进行人工编辑,并且希望编辑后的结果能够得以保留,而不会在进行程序化生成植被迭代工作时被覆盖。

为了方便场景设计师达成上述目标,我们可以使用相关编辑器脚本API编写一些辅助功能。例如提取植被系统中特定区域内的实例(Instance)为独立的Actor,方便定制化编辑。在人工编辑迭代完成后,将这些Actor批量合并回植被系统,以确保运行时的性能。

为了方便场景设计师预览不同性能配置下的场景效果,并感知性能风险,我们还可以将引擎的“Engine Scalability”分级功能,以及我们自定义的性能设置规则。通过编辑器脚本、编写到编辑器工具控件界面中,方便场景设计师随时选择配置,并预览相应效果。

最终,在场景设计师拿到项目开始自然环境编辑工作时,只需要将预设好的灯光模板关卡添加到主关卡,并使用预设的地形材质配合地形高度图、权重图来快速生成地形。通过添加编辑层,以非破坏的方式修改地形,使用地形笔刷蓝图创建远景、山脉、湖泊、河流等地形,并可随时修改或删除。

使用程序化植被生成器生成植被和生态,并且使用脚本工具,划分出人工编辑区域进行精编,可随时预览不同地理位置、不同时间的光照和大气变化,同时也能预览性能分级下的整体效果。

由于整个场景制作工作已被解耦为不同的流程环节,因此对设计师的操作顺序兼容性很强。只要遵循既定规则,大部分操作均可逆,便于快速迭代。

最后,我们再强调一下程序化自然环境制作过程中的性能分级问题。在我们用虚幻引擎制作画面要求较高、美术资源量较大的项目时,性能优化是首要考虑的因素。同样,在使用程序化方式制作自然环境,尤其是大面积自然环境时,性能问题会变得更加敏感。

而自然环境场景的性能优化是一个比较复杂的课题,牵涉到的方面很多,没有一套万能规则,还是需要广大开发者根据项目需求进行具体规划。

通常,我们难以让整个项目的每一位参与者对性能优化问题了如指掌,因此在项目规划期建立一套科学灵活、可操作性强、结果可逆的优化方案,成为便于场景设计师在设计工作中从容应对性能问题的关键。

如果我们能够针对具体项目需求,通过压力测试、数据分析,分别对资产、材质、生态、光影形成整套优化方案,并固化到脚本工具中,将会大大减少性能问题对程序化自然环境编辑带来的阻碍,提高项目开发效率。

虚幻引擎自带的“Scalability”分级系统中,包含了对大量通用性能指标的控制,例如分辨率、比例、可视距离、抗锯齿精度、后处理质量、阴影精度、贴图渲染精度、粒子特效精度、细节模式、材质质量级别、模型LOD偏差、植被密度分级等。

我们可以通过改变系统分级,来统一切换上述设置,也可以自定义具体的设置规则,另外还有一些自然环境编辑中比较敏感的性能数据。例如植被剔除距离、根据对象重要性设置的剔除规则、消耗较高的对象动态出生距离和剔除距离等,则需要我们自定义一套项目专用的分级规则,并与Scalability分级系统相结合,通过脚本工具控件设计成视觉统一的UI界面方便场景设计师用直观的方式预览不同性能配置下的效果,既可以提升编辑流畅度,又可以帮助设计师在特定性能要求下直观地进行设计决策。

综上,希望能通过本话题为各位开发者提供一点思路上的参考。具体还需要大家根据项目实际需求,发挥想象力和创造力,综合运用循环引擎内置的强大功能和方法,为项目带来理想中的平衡点。

我的分享就到这里,谢谢大家!

如若转载,请注明出处:http://www.gamelook.com.cn/2020/11/405684

关注微信