腾讯资深TA:近代游戏技术革新与PCG技术的思考
游戏行业发展至今已有数十年,技术更迭也越来越迅速。本文作者Freddy将从自身的经历出发,谈谈小作坊模式到技术变革对游戏工业化发展的影响,并结构性地介绍了开放世界的制作流程中的环境艺术。(本文首发于腾讯游戏学院专家团月刊《EXP手册》)
作者:Freddy
腾讯游戏学院专家 技术美术
首先我结合自己所经历的这段短暂的游戏发展历程, 结合PCG技术,来简述一下从小作坊模式到技术变革对游戏工业化发展的影响。从行业技术的发展来看,我国的游戏发展经历了从技术混沌时期,进入到了技术专业时期。
虽然这个发展阶段过滤掉了很多使用老旧技术的工种和从业者。游戏开发者也从初期的多种学科的大专本科学历,提高到了专业学科的研究生博士学历,这也是发展的必经之路,提高可以沉淀的长期竞争力是根本。
但无论是以前传统的低模+手绘贴图技术,还是投机取巧的HACK技术,或者现在的学术派硬刚光线追踪等物理算法以及PCG技术。最终还是以艺术家对于画面有完全的控制力,可以完美表达游戏气质的优质画面为核心目标,这将是游戏画面技术发展终极阶段。
出发点:
和许多同龄小伙伴一样,我的童年是在街机厅和电脑房中度过的,世嘉土星游戏机花费了我大量的零花钱。
并且痴迷于研究表哥看完的破旧“电脑报”中的游戏攻略。
和许多小孩觉得泡面真好吃,长大以后赚钱了要天天吃泡面一样,当时我的理想就是天天打游戏。
从做游戏宣传片的外包开始,到开发主机游戏,端游,手游。随着工作上的技术积累,我对游戏行业发展的思考维度也不断的发生变化。
选择行业与入门定位:
初入游戏行业的时候,端游时代的火爆还没有结束,微端游戏逐渐流行,页游时代马上来临。没有人想到移动终端的硬件更新和生态发展这么快,手机游戏会成为碾压其他平台的大众平台,塞班会逐渐消逝,iOS和安卓成为市场主力军。
当时由于PC终端硬件机能问题(现在的手机已经比当时的PC机好多了),大部分国内游戏公司使用的端游开发模式都是:场景地形使用粗糙的自研游戏引擎的地形编辑器制作。角色为低模+手绘贴图技术,特效大部分都是使用简陋的粒子编辑器。图形渲染程序员凤毛麟角,基本上除了几种简陋的光照模型和带有流光的Blend模式外加个Fresnel就没什么特殊效果了。当时觉得笼罩在韩国游戏技术的阴影里,他们制作的游戏品质真好,本世代技术用到特别好,特别羡慕。
然后国内游戏开始进化,可以加入一些简单的ShadingModel并且支持了法线贴图,把画面带有法线(有限的机能下增加细节)和Glow效果(实际上根本原因是可以使嘈杂的画面变统一,并且能够减轻模型锯齿的观感)的游戏作为噱头叫做次世代游戏。特效万物Bloom,各种特效叠加起来的画面在Gamma空间计算下亮到爆炸。实际上我们当时是属于老技术还没有用好,新技术落地抢不上槽的一代。
这时国内一些大型端游公司终于对这方面有了一定的认知,开始深入发力对游戏引擎和技术进行研究了,一些正统一些的端游大作终于也开始着手开发。渲染技术方面开始加入了丰富的渲染模型和布料等物理系统为这些公司提供了一定的技术壁垒。
当时作为一个新手,看到许多非常厉害的前辈和同事具备了非常熟练的使用各种游戏引擎(Orge/BigWorld魔改的引擎或其他自研引擎, UE3/UDK刚开始用,还熟悉了一些比较小众的引擎)地形编辑器,特效编辑器,优化模型和手绘贴图的能力。还经常互相交流一些Trick手法使手绘贴图的表现效果更好,下图就是具有虚拟立体感的手绘贴图。那时真的是硬钢的美术效果,绘画技术决定了游戏质量。那时我在FengZhu的PossibilitySpace工作室充分领教到了美术大师的“手绘贴图”的魅力。
现在回想起来,这些技术栈的积累很大程度上已经被淘汰掉了。我自己和这些同事当时做梦也想不到软硬件的发展速度会这么快,这些熟练的技术经验有很大一部分已经完全没有用了,可以说是浪费了很多的时间。还好我通过轮岗实验,发现对特效方面比较感兴趣,这一工种接触的东西比较全面,并且可以深入了解游戏引擎自己制作独立游戏,稍作判断我就开始往这个方面发展。
未来判断的重要性:
2010年左右,用UDK进行游戏开发流行了起来,我有幸接触了节点式的Material编辑模式实验了很多有趣的效果。并且在UDK官方教程的模块中发现了TechnicalArtist工种,并对自己定位发力研究程序方面的内容,做一个多面手很重要。
当时Houdini在国内影视圈开始火了,就看了一下Houdini方面的内容。实际上现在在游戏行业流行的Houdini已经发售了快二十年了,早就在影视行业流行了。由于之前实习期间做动画影视后期的时候用过Combustion和D-Fusion,觉得节点操作应该没什么难度,哪知由于代码知识一窍不通,入门就被劝退了。由于同时在学UDK的节点编辑器,从而转去学了同样是连连看的NUKE。
现在由于搞自动化生成又捡了起来Houdini,但是容易了许多,可以直接跳过许多教程直接看官方帮助学习。真实的学习过程往往就是这样,时机不够成熟的时候,跳过了能力范围直接去研究,并且无法学以致用的话,效果甚微。
所以对于未来的判断再次显得非常重要,可以先把有困难的问题作为后续目标进行搁置,等前置条件完备后再做这个就非常简单。
然后手游爆发时代到来,我就去潜心搞Unity了,做了几个爆款。由于没有技术栈积累的概念,工作内容积累下的大部分都是工程向的经验...
大势所趋:
短暂的微端和页游时期火了一波后,手游时代到来,似乎随便做一个看起来不差的游戏都能获得一定的成功。以Cocos2D和Unity引擎开发的游戏层出不穷,各大投资方疯狂涌入智能手机产业加速行业的发展。
这时国内游戏行业遇到了一个非常绝佳的机会,由于硬件机能问题,全世界的开发者基本都处于同样的水平线上,使得我们国内的游戏开发者有时间从最基础的画面效果一步一步进行扎实的研究,并且还能赚到大钱。国外的厂商除了游戏设计方面,占不了什么先发优势的便宜,发挥最好的也就做成GAMELOFT那样的效果,远远无法发挥在主机和单机游戏领域那么强的技术。
引申来说,这一段时间技术带来的国内游戏画面进步又有一些弊端,就是技术和画面在不断发展的状态中的提升是肯定的,并且一些项目在这段风口时间下确实成功了。这导致许多团队不重视游戏设计,只注重画面和IP,这方面确实是可以靠钱堆出来的,并且可靠性高。这方面内容有机会再开一篇单聊。小团队由于没有资本加持,就要靠游戏设计的创新来在市场中寻求突破,Supercell这种小团队游击的方式是这种模式成功的典范。
智能手机导致了互联网的又一次爆发,网络上关于游戏引擎和移动APP开发的教程也越来越多。通过盗版软件,搜索引擎和论坛的生态优势,大家相互学习的速度越来越快,甚至到近年来我国开始在手游方面领先于国外手游公司。
我也是这段时期基本断断续续从UE3转型到了Unity3D,并且伴随了Unity引擎的整个发展流程学习到了很多美术技术和程序方面的经验。现在由于对游戏画面和元素复杂度的要求越来越高,一方面要掌握Unity(Unity依然很主要)技术来维护日常工作,另外又开始转回到UE4引擎和Houdini方面的学习,还要对未来的行业发展做出自己的判断。
技术选择的重要性:
随着时间的变化,一种技术的积累会随着软硬件技术的更新和行业的发展被一定程度作废掉,没有人可以保证目前研究的东西会一直有用,你做几十年泥瓦匠的经验不如3D打印来的快。
我自己也在工作中掌握了许多短时间有用但长远看来会被淘汰掉的技术,但是由于要维护日常工作项目的开发进度你不得不这么做,甚至为了维持上线项目稳定性会很长时间不会升级游戏引擎版本。许多软硬件技术的操作积累(软件熟练度与调参甚至编程语言)的重要性会逐渐变弱,直至消失。整体流程性设计方面非常重要,提高对技术的认知比直接研究技术更有性价比。
熟练工的工作未来必然会被自动化工具替代掉,最终返璞归真到内容的开发上。这时美术专注于设计而不是操作熟练度,策划专注于游戏设计和世界观而不是配表配蓝图,程序专注于架构设计而不是工程开发。例如Substance系列或Zbrush等软件的更新,以前由于技法问题非美术问题的认知差异,导致别人可以做出来你却不知道怎么做的美术效果,将不复存在,比拼的是纯美术功底。
职场对于新人的准入门槛会大大降低,因为原来的积累需求向和工程向内容没有用了,老从业者没有了先发优势,和新人逐渐处于同一个水平线上。这时你的优势只有概念与架构上的积累和行业前瞻力,这些的重要性大于基础操作能力。
目前许多人重复造的零碎轮子,逐渐会快速被大型引擎厂商整合为一体,最终达到调节参数即可的效果(有时某人开发的轮子还没有做好,官方引擎更新一个版本就自带这个Feature了。所以提前看引擎官方的规划也挺主要,除非你的效率和开发稳定性极高)。
这些Feature的使用门槛性逐渐降低,导致如何通过你掌握的知识用好轮子成了核心内容。未来的游戏引擎将发展为一个具有一定定制化功能的,操作非常简单方便的一个游戏编辑器,乃至任何大部分游戏玩家都可以进行UGC内容创作。
不断学习,磨练自身:
总之随着游戏开发规模越来越大型,开发模式走向工业化的路是必然趋势,所以可以对这方面内容不断的学习和思考。
支撑游戏工业化发展的一个重要组成部分就是我们本篇的下一个主角 - 过程化内容生成技术(PCG),我在摸索这一部分内容的时候觉得逐渐掌握了一些规律,并不断的改进和纠错学习方法。我断断续续开发的游戏技能自动化生成工具,也算是其中的一个方向吧。
Procedural Content Generation 程序化内容生成
过程化内容生成,是需要先输入特征参数和基本材料,然后通过一系列的定制化(或具有一定随机性的)算法,来大批量的实时或离线的生成内容的一种方法。
WIKI:
https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E5%8C%96%E7%94%9F%E6%88%90
百度百科:
https://baike.baidu.com/item/%E8%BF%87%E7%A8%8B%E7%94%9F%E6%88%90/4661028?fr=aladdin
随着国内游戏厂商越做越大,工业化趋势越来越明显,最近PCG的使用在国内游戏行业逐渐流行起来了,周围的好友几年前就已经开始布局和推动研究这方面的内容。
但是当大家的认知程度还没有提上来的时候,或者说是契机不存在的时候,实际上技术是很难去推动的。现在由于国内各个游戏厂商陆续开始做开放世界游戏了,所以这方面技术得以落地。
从福特公司开始搞人工生产线开始,企业管理者发现这种流水线模式可以大大加快生产速度,并且由于不同工种工作耦合性低,所以出错率相当低,这时还不涉及到全自动流程。它另外一个对于企业的优势是这种工人工种的单一化使得可替换性升高,降低人工价值,进一步降低成本。分工越细成本越低,自动化越高成本越低。
随着自动化机械的不断发展,逐渐从人工流水线演变为机械化的全自动生产线。我在公司内部分享的时候有一个例子就是从简单的糖果生产线到现在战斗机的生产线再到半导体的生产线的对比,一个好的工业化流程可以大批量源源不断的制作出非常精密复杂的东西。
直到整个流水线只需要输入一些物质不需要或很少需要人为干涉的时候,就演变为了程序化生成。
在游戏生产中,我把PCG技术的优点从三个方面来看:
第一点,是对于游戏工业(这里指大型游戏)发展来说,是其工业流程管线的重要组成部分,可以大大提高游戏资产生产速度,并降低成本,且出错率低。这对于大型游戏项目外包的控制力的优化是非常重要的。
第二点,就是PCG产生资源的数量级巨大,可以在玩法上进行大量创新,不断的随机自动内容生成,可以激发游戏设计师的想象力。
第三点,可以在有限的硬盘空间内实时动态生成无限的新内容省去硬盘空间占用,并且可以让玩家反复游玩新的自动生成关卡。也可以离线计算可以优化游戏性能,让玩家有广阔的空间进行探索。
国外游戏大厂由于积累的早,很多年前就实现了工业化游戏制作流程,自己不断研究核心技术(一部分是游戏技术一部分是游戏深度),然后赋能给发展中国家进行外包制作。这种开发模式一是节约大流量成本,二是开发效率非常高,三是内容产出稳定。
这就直接导致了老外AAA工作室有时间去花时间研究创新和前沿的东西,而发展中国家只能使用别人剩下的东西。更直接的一点就是他们除了关键Milestone或Deadline临近节点适当加加班,基本告别996了,这是一种健康的迭代状态,有时间去体验生活,并且艺术来源于生活,所以游戏会越做越好,越有深度。
在游戏PCG的生产规模上并不是只有大型开放世界游戏需要PCG技术。
我分了以下的几种维度:
规模上从宏观到微观,只要有规律就可生成模拟:
PCG生成宇宙 -> PCG生成多样地区的大世界 -> PCG单一地区生成 -> PCG局部地区生成 -> PCG微观生成
这里的所有维度都包含着以下几种资源:
PCG任务生成:自动生成任务,自动生成NPC对话,自动生成游戏任务,自动生成叙事剧情。
PCG环境生成:自动生成地形,地牢,洞穴,天空,宇宙。
PCG模型生成:自动生成动植物,自动生成建筑,自动生成物体(各种岩石,各种物品),自动生成景观(云体,水体,极光)。
PCG动画生成:使用MotionMaching可以差值组合出数万倍的动画效果,机器学习甚至可以自动生成动画不需要人为操作。
PCG特效生成:使用一定的规律模板来自动生成各种特效,包括各种环境变化,魔法,弹道轨迹,刀光,技能 和 屏幕后处理氛围特效。
由于我们人类目前使用的终端硬件技能所限,所以游戏世界的复杂程度无法各方面都兼顾到,所以就需要进行权衡。
游戏《无人深空》在一定程度上使用PCG技术实现了小规模宇宙的制作,但是由于星球本身直径较小,并且地貌单一,所以也算不上大世界,但是是一个细化问题。
而游戏《EVE》实现了更大规模的宏观宇宙生成,但是局限于星体生成,星球内部是看不到的,所以复杂程度也大大降低。
目前的PCG开放大世界生成,实际上和现实的环境比来说还是非常小的规模。几十公里的地形范围实际上只能算是某一个局部环境区域。在游戏开发过程中由于开发精力有限,和硬件机能问题,往往都把大世界缩小到数公里的范围之内。所以游戏领域的大世界生成技术就是在数公里的范围内,在保持一定的多样性的同时,使用PCG技术配合人工局部调整来进行游戏世界的创作。包括《地平线:黎明时分》《荒野大镖客》《FarCry》《GTA》等这些出色的游戏,制作他们的工作室在研发时也是一个权衡,在次世代主机的性能固定的情况下,他们选择了相对范围比较适中的地貌的PCG区域生成,几十公里的规模算不上大世界,但是玩家体验方面有了足够多的可玩性。
从微观上来看,如果视角放的足够小,类似于蚁人,一平米的地面也可以容纳大量的资源,地衣都会变成茂密的森林,并且细节丰富程度会指数级别增长。
所以我认为所谓的大世界自动生成需要游戏设计师对于自己的游戏想要表现的东西要有一个判断,你是想表现类似《EVE》那种宏观宇宙战场,还是类似《皮克敏》那种微观区域。PCG它的最重要的核心优势不是地形有多大,而是承载这个地形中的内容数量和丰富程度的多少,并且这部分内容靠人力是很难制作出来的,并且这种随机性的效果看起来会非常自然。
下图是EVE中使用 Diffusion-limited Aggregation 算法程序化生成的宇宙:
如同我的上一篇文章,本文不会过多的去讲解工具的使用方法(不同的团队使用不同的技术栈,可以自行去技术论坛搜索,并且写起来细枝末节长篇大论),只讲概念或者理念。
因为就像前面讲的,工具随着时间迭代会足够的智能,操作傻瓜化,而你所掌握的概念实际上才是把任何工具用好的基础。不要妄图以操作的复杂程度作为门槛,而没有沉淀下来研究背后的知识(地理,生物,人类学,数学等等),每一门知识都够研究一辈子了。
目前自动化生成技术运用的比较广泛的就属于生成游戏大地形方面了,那么我们就从这里开始介绍。
大地形生成方法:
如果我们的游戏设计师设计好了一片区域,在大地形制作的时候,就需要先把生态的规划搞好,这需要收集大量的自然生态参考信息(经纬度,海拔,地貌等)。我们搜集的信息越多越好,然后对信息进行抽象化,输入到PCG工具生产管线中。这样,我们生产出来的游戏世界就会比较自然,并且在具有一定随机性的同时,保持有一定的合理性,确保看起来没有违和感。这一点非常重要,决定了后面所有的软件操作方法,会导致最终的效果好坏。
下图是我对于当时使用的开放世界PCG工具管线制作的大地形开发做的一个流程图(属于比较流行的Houdini管线),这些所有步骤都会影响大世界场景的最终效果和合理性。
目前在游戏公司的开发中,虽然不是大世界,但是我们大都把超过几十公里带有多种地貌的游戏世界规模统称为大世界。在这个流程中实际上我认为是越上层是越关键的。当时由于一些工具和二次迭代功能比较简陋,所以制作起来还是比较麻烦的。但是这些后面的所有步骤虽然看起来很复杂,但是都属于软件操作,随着引擎程序员对各种工具特性的不断完善和优化会越来越简单。
我们要对整个流程进行重视,而不是把认知停留在自动化的软件制作阶段。我经常吃饭时和朋友们提起:我们有多久没有面对一株美丽的花朵而驻足停留?如果你连真实的花或者植物或者风景都没有深入观察过,只看参考图又如何创作出有说服力的作品呢?这一点老外做的非常好,在游戏开发过程中会经常带领游戏设计师,TA或原画去实景采风,这是采集信息的关键部分。
还有就是,不要把风景的好坏完全的依赖PCG生成技术,还是要有人为的干预和景观设计。在现实世界中,地球的表面环境虽然是在历史的随机状态下逐步生成的,但是5A级风景区还是屈指可数。在游戏场景设计中,我们要保证的是场景的美观性,这就需要大量的环境景观设计,游戏中需要一些有功能性或故事性的奇景更是如此,直接完全靠随机生成的效果是不一定好看的。为了让人为设计的环境控制起来比较方便,所以PCG制作环节中的局部环境的动态更新非常重要。当然,PCG随机生成的物体的随机效果的优点就是看起来比手动摆放的假随机看起来要自然和生动许多。
创建大世界游戏首先要对游戏的世界观和游戏画面风格进行一个基本确定的定义,这个定义会影响后续所有的制作过程。游戏制作人对于游戏世界的定性,然后是游戏策划对这个上层的概念进行细分设计,把世界划分为各个功能区域,然后把不同区域的生态和人文规则交给概念原画做效果图和气氛图。
然后我们通过对游戏世界进行地理和生态规划,然后通过这些规划对世界进行不同地貌的区域划分。
这里的地理和生态规划要具有一定的科学性和逻辑性,大部分设计要有科学支撑。写实类环境的规划要有逻辑性,会让人看起来自然一些,否则会看起来非常怪。
特殊的不符合常识的地理和生态部分,要有完整世界观对其进行支撑。
地形生成软件选择使用WM的原因是WorldMachine出现时间较长,技术栈稳定,并且可以更改更加底层的节点算法。缺点是操作会略复杂一些,并且预览和操作非常麻烦。新兴的地形软件WorldCreator和Gaea由于操作更加简单,预览效果快,逐步也被大量使用。这种软件选择看个人倾向,但是同一个团队要做到统一。
这里我先通过线性流程的方式,尽量完整的抛去具体操作来讲解PCG大地形开发流程。一些理念也是参考了《FarCry》和其他的一些游戏。
以下内容涉及到一些自然景观大地形PCG制作的具体操作流程,比较枯燥,不感兴趣的读者可以跳过。
地表生成概念:
分类:对大地形物体材质进行分类
划分:对不同材质分类进行区域划分
混合:对不同分型进行混合合并
地表生成线性流程:
WorldMachine:
1. 地图不同地貌区域划片(森林,草原,山脉,草原,山丘,沙丘,沙漠,沼泽,海洋,湖泊)。
2. 基础图形绘制大致基础地形走势,要抽象为高度趋势,不要进行细节刻画。多使用Clamp工具来调节整体高度(如果你使用其他的地形编辑软件可以用笔刷刷,要简便一些)。
3. 使用曲线工具或形状工具绘制山脉位置,通过调节节点高度和增加随机(UseBreakup)等属性来调节形状。调节时依然尽可能进行抽象,只控制大体形态,多使用Clamp工具来调节整体高度。
4. 使用形状工具绘制湖泊或其它特殊用途区域对基础地形进行叠加。
5. 使用河流工具绘制河流走向,并可增加自动水系节点来进行自动生成。
6. 对地形进行一系列腐蚀与沉积操作。
7. 拼合不同地貌区域。
8. 使用曲线工具绘制道路,并使用工具自动贴合地表,调节高度曲线来对路面和路基进行造型。(这一步可以在houdini中生成)
9. 对整体地图的材质进行分类和归纳,移动平台需要注意Layer的混合,同一个区域最多混合4层。(也可通过其他方法超过4层混合)
10. 导出高度图,高度图尺寸和高度必须是游戏引擎所规定的比例。
11. 导出整体颜色图。
12. 使用各种选择工具,混合各种MASK得到归纳后材质分类的MASK。
13. 导出地图各个区域的MASK和点云生成所需要的斜率,方向,侵蚀,沉积等MASK。
Houdini:
1. 导入高度图文件。
2. 使用制作好的节点生成道路、河流。
3. 导出HDA基础地形到UE4中。
UE4 / Unity:
1. 导入HDA文件,拖入场景cook地形。
2. 为地形文件创建地表材质,把之前生成好的整体颜色图赋予材质,我们要对UV进行一个缩放,比如8X8KM为8129。
3. 根据不同的地貌种类创建不同材质的MaterialFunction,设置好LayerInfo(注意Weight-Blend(normal), No Weight-Blend的关系)。
4. 复制创建好的地表材质的路径(二次迭代)。
5. 把地形材质赋予地形,使用地形工具导入LayerMask并预览效果。
6. 在引擎中开启地表分层预览(先切换到地表编辑菜单,然后在游戏编辑窗口点击左上角Lit/Landscape/Visualizers/LayerUsage)。如果是移动平台要看看每个Component中的层数是否超过4层的限制。如果超过了4层则需要回到WorldMachine中调节LayerMask,更复杂的混合要在Shader中实现。
Houdini:
1. 在基础地形的HDA中,创建unreal_material节点。
2. 把UE4中复制的材质路径粘贴到unreal_material节点上。
3. 重新导出HDA文件,这样我们在UE4中重新COOK HDA的时候就不需要重新编译许多shader(二次迭代)。
UE4 / Unity:
1. 重新导入新的HDA文件,并recook。这时会自动加载我们创建好的地表材质。
2. 对地表的一些细微区域,使用地表编辑器的笔刷进行调整。
3. 把地表贴图导出到WorldMachine中重新运算腐蚀等效果。(二次迭代)
物体生成概念:
根据游戏世界观来对游戏世界中的一定范围内的植物或建筑进行合理规划,并符合客观规律。其中包括但不限于经纬度,海拔,地质构造,气候等因素。
物体生成线性流程:
Houdini:
植物生成:
1. 创建一个node准备点云生成需要的基础数据。首先导入基础地形,然后导入我们需要的地形软件中导出的不同的MASK数据。也可在Houdini的maskbyfeature节点中计算MASK数据并进行混合运算,但是混合层数的比较多后会影响预览速度,所以推荐尽量使用WM等地形创建软件输出。
2. 通过使用heightfield_copylayer节点进行多种MASK预览,一边预览一边使用volumewrangle节点对MASK进行编辑。最终把各种植物所需要的MASK基础数据准备好。
3. 创建一个新的node来准备点云文件。由于大世界地图非常大,导致点云数量级庞大,为了预览方便,我们需要使用tilesplit节点对地形进行切割。
4. 然后我们根据需要生成的点云类型新建几个biome node,每个biome node一类物体,对切割好的tile中进行各种类别的点云生成。
5. 我们需要进入每一个biome node中创建“地表物体计算”节点来生成点云。这个节点是基于《FarCry》和《幽灵行动》等游戏的技术分享来推导实现的功能,其生成方法是通过提取各种MASK的区域进行权重混合计算,并通过互斥算法来实现点云之间的聚落形式,生态竞争关系,具体的细节操作方法的在此不表。
6. 点云生成时我们可以通过把简模赋予点云进行预览。
7. 这里要注意的是,点云生成时实际上单个的美术元素已经准备好了,这非常主要,我们需要把准备好的美术资源在UE4中的命名填写到“地表物体计算”节点中才可以正常读取。
8. 最终通过python代码把物体的 FoliageTypeName/位置信息/缩放信息/旋转信息 写入到csv文件等数据格式。
建筑生成:
1. 导入大量建筑复用模块和挂件。
2. 通过节点来根据形状和需求来拼合建筑模块。
3. 导出建筑。
UE4 / Unity:
1. 大型开放世界项目中,引擎程序员会提供UE4读取csv、json等数据交换格式的插件。我们可以通过插件一次性导入所有植被或物体。
2. 这些生成好的物体可以使用UE4的植物系统进行二次操作,也可以输出为csv等数据格式被Houdini读取。
二次迭代:
当美术或者策划地形有局部的修改的话,大面积的生成还是非常耗时的,很难所见即所得的去修改点云信息。
在UE4或其他游戏引擎中可以使用笔刷对点云生成的文件进行修改。
修改后的文件点云信息出现了变化,需要把这些引擎中的点云信息反导为csv文件。
然后使用Houdini对csv文件进行读取,读取的点云文件作为基础信息生成新的点云,这里的重新生成是分了Tile的。
同理,当修改了道路,河流,地形时,同样需要二次迭代,但是这些信息是导出不了csv文件的。这就需要使用PDG或其他方法集成Houdini的功能到游戏引擎中。
下面几张图是我实验PCG流程时候,使用虚幻商城资源生成的结果,完全PCG没有任何人工干预生成的效果。还有很多地方需要手动优化,这些手动优化需要很多概念上(地理,生物,美学)的分析过程,而上面操作部分的这些流程我觉得重要性不如我后面要叙述的概念性的内容。
上面的流程如果你已经熟练掌握“道”,成功成为了一个合格的“软件使用者”。
那么流程有了,如何让生成的东西保持美观并且和其他人的作品形成差距呢?
你必须掌握自己的一套理论和审美的框架(“术”),这是我觉得最重要的地方。
过程化内容生成出来的东西的美观程度直接受到这方面概念上的影响,这是我觉得最主要的部分,所以着重讲解一下。由于工作内容敏感度问题,我拿UE4公开的一个官方DEMO《放风筝的男孩》进行讲解。
通过对这个DEMO进行剖析,可以使我们意识到如何使画面更协调和生动有趣。
我分析时没有参考任何文档,他们的植物或许是用虚幻默认的植物生成器生成的,如有雷同纯属巧合。
首先最重要的一步就是必须定义好环境。这一步的定义如果模棱两可会导致很大一部分内容填充前功尽弃或工作上的反复。
查找了很多风景的资料图后,我觉得这个场景一定程度上参考了现实中位于罗马尼亚的Retezat国家公园(下图),具有很大的相似性。
在正式制作之前,首先要对这个场景的地质和生物构成进行了深入的分析,哪些些地方怎么生成怎么制作,哪些地方由于镜头画面需要加入一些奇特的景观。
首先这个Retezat国家公园的景观多样性就非常好,并且很美观,我相信项目区一定对这些美观元素进行了归纳。
这个研究过程使我会在其他任何环境的生成之前,先用这个步骤深入的分析,再进行流程化软件操作。分析透彻,想清楚后,再进行的制作。
这个地形的不同区域划分为以下几种:
1. 山顶区域:由于高度图限制,高度差比较大的地方精度会很低,所以需要插入模型。
2. 悬崖区域:陡坡由于高度图限制,高度差比较大的地方精度会很低,所以需要插入模型。
3. 碎石区域:主要靠点云生成和一定的手摆物体。
画面丰富程度提升(这部分涉及到一部分景观的美学知识):
虚拟湖泊(使用Material制作的伪湖泊效果):
方法:
这个地图的基础地貌分为大面积生成和手动景观摆放两种。
基础地形(Terrain & PCloud):
手摆区域:
虽然这是一个大型的在合理规则基础上,带有一定随机性生成出的环境。因为我们的目的是让游戏体验变得美观而不是完全真实,所以在保证合理性的同时,为了画面变得好看,许多部分还是增加了一些的景观设计成分。
长时间在地貌非常统一的大世界中进行活动,会使玩家对于画面产生审美疲劳。这需要专业的美术设计人员根据基础地形进行设计。
景观设计:
如下图中在大世界地形的一块地标性的岩石的风化效果,作者没有生硬的把石柱插入在地形中,在衔接部分增加了一些阶梯状岩石,并在顶部覆盖了巨型石块增加丰富程度。
下图中是表现了在大面积平原部分出现的大型裸露岩石效果,由于自然风化和地质偏移,加入一些岩石会形成崩塌。看起来非常自然。这种景别并不是完全随机生成的。
在景观设计中,经常会植入具有一定美感的植物来打破画面的单调性。比如下面这种树的用法就比较常见。为了表现高低错落还增加了一些岩石。
在美术画面设计中,经常会对画面构成进行一些对比,这样也会大大增加画面丰富程度。常见的有大小对比,形状对比,疏密对比,颜色对比等等。
在单调区域植入个别物体可以打破画面的单调性,并且更加美观。
手动摆放的具有强烈特征的景别。
山顶位置规律(这部分可直接PCG生成,但是这个DEMO中是手动摆放的):
单纯的地表模型非常简单,特别是山顶容易产生光秃秃的效果,除了雪山外的表现力都比较差。
由于高度图的垂直精度问题,对于垂直结构比较多的地方,需要加入模型对画面进行辅助。
这时我们需要获取山体的山顶部分的MASK,用来生成点云对山顶进行岩石模型嵌入。
下图是山顶岩石模型实例。建模时要保证多个方向旋转起来的多样性。
斜坡坐落的岩石群落:
悬崖摆放(悬崖模型体积非常大用于远景还可以):
山体坍塌与碎裂:
山体坍塌后摆放的石头群组:
场景边缘衔接:
点云生成区域(实际上在画面构成中只占有一半或者2/3的空间是全自动生成的):
通过以上分析。可以了解到,这个类似于Retezat国家公园大地形的山体的地质构造是基于岩石的,在巨石表面具有浅层土壤,然后表面长草和少量树林。巨石具有坍塌和裸露的特征。
从多样性上来看,山体和地表本身会覆盖基本的土壤和植被,但大量的地方会有大型山体岩石裸露的坐落在地形外面,这会导致靠近岩石裸露的地方会出现坍塌和悬崖的效果。地表本身除了覆盖植物以外也会在某一个区域(具有一定随机性或美观性)覆盖巨型岩石和小型岩石。这些因素应该是在地图制作之前就应该研究好的。
我们用河流生成举个例子,河流生成时需要了解一些基础的地理知识。然后把这些知识抽象归纳到算法中进行PCG生成或一定程度上的手动摆放。
水系发源区域由于非常浅表,会是岩石裸露小溪的状态。中部区域逐渐由V形过度到U形。下部区域会形成开阔的泥沙堆积区域。
在Houdini中通过曲率运算和样条线操作等一系列算法,最终使用volumevop与地形混合生成的一段河流。很多功能和节点都是现成的,网上也有很多教程,先照着模仿即可,然后总结自己的经验模型,再反推给引擎程序员或高级TA帮你完善功能。还有道路,栅栏等其它功能都是同理。熟练掌握这些工具后就需要结合你的地理学经验来制作比较高端的效果。
同样,山上的盘山道路的生成会依赖于基于斜率的自动寻路功能,还要有自动避开山体、岩石,城市道路避开建筑等物体的功能。
城市的PCG生成也是如此,并且由于人为对环境的随机干扰性太大,所以分析的要更加透彻才行。
再说回PCG工具的迭代过程,在工具处于迭代前期不好用的时候,操作麻烦是工作时的痛点。在轮子不断迭代的过程中,会由TA或TD来处理这部分复杂的操作,充当人肉轮子来操作和维修高复杂度的轮子,组装冗长的轮子流程,并且把功能反馈提供给引擎程序员。当准备好某个方面的程序化生成概念后,需要尽可能的把轮子拆解为非常简单的工程问题,复杂的问题想清楚后往往非常简单。轮子发展到最终阶段会变为易用性非常好的工具,这时就不需要TA或TD了,只是这个过程非常漫长。这个漫长的过程也是游戏工业化持续不断发展的过程。
好久前写的了,虽然有点过时了,先到这里吧。
来源:腾讯GWB游戏无界
原文:https://mp.weixin.qq.com/s/tfyLAN1xM0gVMpO8el5E2A