The Light Remake的发展历史。第2部分





问候读者!关于Light Remake开发的文章第一部分概述了将游戏移植到新版本的Unity的过程。我谈论了一些有关使用的着色器和效果,在光照下实现了什么解决方案,创建了哪些附加内容,对旧版本中的内容进行了重新设计等。在第二部分中,我们将讨论开发的其他方面,关于后期效果,项目结构,合理的声音,优化和其他细微差别。



第2部分



后期特效



将项目转移到新引擎时,决定保留旧方法来实现Unity早期版本中使用的后效果。与他们合作对我来说更容易理解,我可以对图像处理本身进行必要的更改。



Gamma



原始游戏中的后效果并不多,但是最突出的效果之一是色彩和亮度校正。然后我设法随机获得令人愉悦的发白光和有点凉爽的配色方案。图片对比鲜明,并强调了该地点的奇妙氛围。视觉风格有点让人联想到《战地风云3》的调色板,在我看来这是一个非常幸运的巧合。



一个有趣的细微差别是,后来在原始游戏发布之后,我没有设法完全重复这种效果,总有一些细微之处使图像看起来不像原始图像。在这方面,我决定将重制中的配色方案更改为更暖和更积极的方案。绿化变得更加明亮和富于表现力,并且气氛变得与闷热的夏日联系在一起。作为奖励,完成游戏后,我添加了启用色彩校正的功能,与原始功能类似。











体积光



在此翻拍中一个非常重要的元素是与光相关的后效应。旧版本的Unity具有非常好的Sun Shaft 3D效果。但是,它的功能是有限的,因为它只能绑定到场景中的一个光源。



在某些时候,一个非常有趣的体积照明效果体积灯火吸引了我的眼球它使您可以创建非常漂亮的浓密发光和来自不同来源的光线。场景中的气氛变得越来越大,物体开始沉入空气中,这给我留下了深刻的印象。唯一的缺点是这种效果的资源强度很高。尽管如此,我还是决定应用它,多亏了体积光,我设法在整个场景中从阳光中营造出令人愉悦的光线,以及某些地方的神秘定向光束:游戏开始时的走廊上,一处有麻雀的房间。该效果还用于强调夜间发光的灯柱上的重音,在放映机的情节中,在锅炉房中,以放大来自窗户的光线,在角色提升为光线的最终场景中。







SSAO和SSR



其他最重的效果是SSAO(环境光遮挡),它会在拐角处和表面下产生柔和的阴影,无处没有。还添加了SSR(屏幕空间反射),即使在开发阶段,也确实存在许多问题。 SSR模拟在光滑表面上的反射,从而在瓷砖,金属等上产生漂亮的反射。问题是效果非常沉重,几乎使我的硬件上的FPS减半。通过后效果代码中的一些操作,我设法略微降低了计算质量,并略微提高了性能。通常,帧速率是可以接受的,但是在某些情况下(例如,启用了Vsync),SSR在角色移动时会引起周期性的停顿和抽动。







其他



除列出的效果外,该项目还使用了晕影,色差,色调映射,抗锯齿,全局雾化和光晕。为了优化,将小插图,像差和色调映射合并为一个过程。







顺便说一句,现在,当我处理图形时,我经常回想起我在艺术学校学习的个人经验,当时我们被教导要强调物体下方的对比阴影,在物体表面上显示反射,并在与风景一起使用时在地平线上施加雾度以强调空中视角。现在我知道全部都是SSAO,SSR和Global Fog!



怎么运行的?



最初的项目实际上是放在膝盖上的。那时,我没有任何编程技能,并且游戏的所有功能都是基于一些简单的脚本构建的。最主要的是我在标准Unity资产中找到的Activate触发脚本。所有功能均基于以下事实:角色进入触发器,打开或关闭某些对象并引起必要的动作。毫无疑问的是保存或游戏设置。



系统



当然,要实现重制,必须从头开始编写整个游戏系统:控制系统,保存,设置和游戏机制。总的来说,对我来说,项目系统的胜任建设仍然是一项艰巨的任务。通常,我创建带有多个子对象的基本系统对象。它们每个都执行自己的一组功能,并且都相互关联。



由于游戏基本上由一个位置组成,因此我决定不打扰加载场景,预制件和组件,并将我需要的所有内容都放在一个主场景中。创建的控制器可以管理您所需的所有内容,切换设置,保存游戏并读取保存的数据,从游戏根目录中的特殊文件中读取字幕和注释的文本等。为了易于实施,就像在以前的游戏中一样,决定在检查点中使用保存系统。该位置包含数十个交互式对象,例如门,游戏项目,煤油灯等。对于每次保存,必须记录对象状态标识符,该标识符通常是Int变量。例如,门已关闭并用钥匙锁定:DoorOpen-o,DoorLocked-1。由于我在该领域的技能有些特定且肤浅,因此我不会详细介绍编程主题,但是,它们足以实现我自己的项目。



两个决赛



对我来说,一个有趣的任务是实现虚拟计分,以实现其中一项终点选择。我想将挑战的一些元素引入翻拍的游戏过程中,然后我想到了将这个想法与游戏的主要符号-带灯光联系起来的想法。决定创建一个计数器,该计数器将通过几个参数来分析环境光水平。最终的比赛将取决于玩家在光线充足的地方或阳光下停留多长时间。第一阶段是从放置在场景中的光探测器及其发光度收集信息。将此参数转换为平均值并写入float变量。







此外,该脚本考虑到附近存在其他光源,例如,灯,窗户的光线,开着的灯笼或打火机。条件之一的存在会为已经计算出的光线指示器增加某些值。最后,阳光直射对角色的影响最大。从角色的太阳光线中射出一个射线,以告知系统玩家是否在开放的阳光下。



所有这些值都由一个计数器累加并计数,该计数器在游戏结束时确定决赛的状态。如果玩家很少在直射光线下访问露天天空,很少使用灯笼和打火机,那么最终参数将很低。该系统并不总是准确地确定照明水平,但总的来说,它可以完成其任务。为了进行调试,并作为附加元素,角色手中的金属管上有反射涂料的斑点,这是照明的指示器。



字幕和本地化



为了进行翻新,研究出了一种新的本地化方法,通常是显示文本和消息。更准确地说,该方法已在第七部门项目中使用,但是其中的内容量要少得多。将数据保存到HML文档中的方法作为基础。用于本地化的所有文本信息最初都存储在游戏根目录的xml文件中。消息分为几组,并分别进行标记,属于某些类别和某些语言。对于换行符,我决定使用(*)字符,并开始一条新消息(#)。







在适当的时候(选择一种语言并开始一个场景时),控制器读取所有文本信息,将其分为行和独立的组,然后将其写入一种库或字典中。然后,例如,当打开菜单或激活屏幕上的字幕时,各个脚本会读取此信息。在我个人看来,该系统很方便,而且最重要的是可以理解。它使您可以轻松输入新语言并更改现有文本。



声音



一些基本声音是从原始来源继承而来的。环境,鸟鸣,电影放映机的声音等决定离开以保留对该项目的认可。但是,需要很多新内容。增加了角色本人的声音,台阶,激活的对象,英雄在某些时刻的呼吸,心跳的效果等。添加了更多的变化,包括环境声音,蚱chi的嘶嘶声,物体掉落的随机声音和猛烈的敲门声。顺便说一句,我从新的Half Life Alyx的景观中得到启发,增加了蝉或蚱hopper的声音,在炎热的夏日的气氛非常凉爽。我喜欢在Youtube上听和看City17上的Ambient录音。



大多数声音是从免费图书馆借来的。片段彼此结合,应用效果,改变速度等。



配乐的创建成为负责和艰苦工作的整个层面。原始项目中的作品未经许可,它是Ludovico Einaudi,作曲家Thomas Newman和OST的一组曲目,作品来自“害怕怪物”游戏。但是,我们通常会成为第一次听到的灵魂,例如,至少对于我来说,曲目的原始版本似乎比其混音更令人愉悦。在这种情况下,当我创作新作品时,我真的很想保留原始曲目的风格和氛围。在我看来,我们之前与之合作过35MM游戏的作曲家Dmitry Nikolaev在这项任务上做得非常出色。我对演讲厅放映电影时所听到的动态构图的新印象尤其印象深刻。曲目保留了原始的充满活力和迷幻的风格,开始听起来很新鲜,但可以识别。顺便说一下,电影本身也进行了重大修改,并包含了许多新材料。为避免侵犯版权,对视频的内容进行了更仔细的选择,其中一些片段是独立创建的。



该链接显示了原始2012游戏中使用原始视频







尽管游戏中没有对话,但还是有声音表演的地方。录音由Vsevolod Petrykin协助,他曾参与35MM项目,并向主角Petrovich发出了自己的声音。当飞机出现时,可以从扬声器中听到他的讲话,也可以从主楼二楼发射导弹的情节中的电话听筒和收音机中听到他的讲话。



优化



优化已成为翻拍工作中最痛苦的主题和任务之一。碰巧,就硬件负载而言,我之前在旧版Unity(4.6)上创建的几乎所有项目都非常简单。在我的GTX 970上某些地方播放35MM时,在相当复杂和繁忙的场景中,其输出为200-300 fps。建立在引擎早期版本上的原始Light的FPS更高。但是当切换到Unity 2017时,帧速率下降了2-3倍。显然,场景变得更加复杂,增加了对光和反射的误计算,附加的后期效果等。但是我没想到性能会如此大幅度下降。问题是,即使从场景中删除了几乎所有内容,我的FPS也没有超过200-300。这是一个半空的阶段,卡尔!为了简化某些几何图形,创建Lod组,设置遮挡剔除等,已经做了很多工作。







同样,使用脚本为摄像机分配了某些图层的剪切距离。为了实现,使用了Unity手册中的示例。将不同大小的对象分配给单独的图层,如果相机距离太远,则会停止渲染。 20-30米后会切掉诸如罐头,垃圾,木屑,书籍之类的小物件。较大的-60-80后。上述所有措施已大大减少了抽奖活动的数量。平均而言,场景中的绘图调用次数范围为800到2000 DC。框架中的多边形数量不超过一百万。







灯具剪裁



作为优化的一部分,将创建一个特殊的脚本,该脚本每2-3秒确定到小型动态光源(如煤油灯)的距离。将摄像机从灯上卸下后,脚本将它们关闭,以免给系统加载不必要的过程。同样,当角色下降到地下室时,阳光源也被关闭。这大大减少了DrawCalls的数量。



很少的细节



  • 在地下走廊的混凝土下水道竖井下,滴着水,您可以看到屏幕上出现了水滴(字符的眼睛/眼镜)。简单易行-假设英雄能击中扳机,并且当摄像机指向上方时,将打开使用泥泞的Grabpass材料制作的粒子系统的预制件。同样在此刻,如果将手拿到卡的表面,可能会掉落。






  • . . « », . . , .






  • , .


  • , , .






  • . “STALKER ” , . , , . , . , / .


  • , — 3 . , , . . .






  • , Half Life Alyx, . , . , . , «», . .






  • , , . , . , Graphics.DrawMeshInstancedIndirect .
  • . , , .








从文章中可以看到,开发自己的项目是一个非常费力的过程。这是不眠之夜,不断寻找解决方案,寻找灵感,失败和胜利。但是,它带来了极大的乐趣和自我实现的感觉。我要说的是,这不仅仅是一项工作-它是一种生活方式。我们的思维是惊人的,能够创造出有时无法与现实相提并论的惊人事物。任何人的头盖骨中都有一个整个宇宙,这真是太好了,能以某种方式通过您的活动(无论是电影还是电脑游戏)来显示这个世界真是太好了。每一件作品都是个人的,是通过艰苦而艰苦的工作创造出来的,是非常重要和有价值的,首先是对自己而言。



祝大家好运,创意灵感和高FPS!



All Articles