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





问候读者!我叫Sergey,我是独立的电脑游戏开发商。我的投资组合中已经有几个独立项目,其中一些是在Steam上自行发行的。 2012年发行的游戏Light或The Light是我在游戏开发领域的第一支笔和先驱。该项目是免费分发的,但是公众的反应和参与者的反馈给了我进一步开展工作的强烈动力。对我来说,“光”已经成为关于人类及其命运的哲学寓言。情节是抽象的,没有追求任何特定的目标,这只是一个思考广泛主题的机会。



由于原始游戏从未在Steam上发布,因此我决定更正此遗漏,并于2019年6月开始对该项目进行大规模的重新设计,以使其可以与游戏玩法和视觉上相匹配,并被认为是成熟的游戏。







我们在说啥啊?



本文将特别关注“ Light”项目以及与将游戏移植到Unity引擎的较新版本相关的工作。这意味着很多技术上的细微差别。本文将分为两个部分。



第1部分



该游戏的原始版本于2012年基于Unity 4.2构建。然后,在我的信息领域,仍然没有关于PBR材料,反射测试和其他当前相关方法的讨论。 Unity中的基本着色器非常简单,而且不太现实。当然,可以添加许多其他元素,例如菲涅耳反射,但是着色器编程对我来说还是个谜。对于具有透明性的对象(树叶,卷曲的金属格栅),使用的主要着色器是“法线凹凸高光”和“ AlphaTest”漫反射。



没有riltime阴影,几乎所有照明都被烘焙为纹理,并且这些阴影的分辨率在某些地方非常低。将光线烘烤在所有其他物体的顶部,可以将凹凸贴图高光着色器的凹凸效果降低到接近零,从而使这些对象在仔细检查时看起来更像是平纸板。



由于相机上的后期效果,特别是“ Bloom”和“ Color Correction”,图片被显着改变。他们增加了色彩和多样性,尽管它们在某些地方太让人讨厌。







在创建该项目时,我仍然对优化,批处理(合并为一个网格),遮挡-剔除(切掉不可见的对象)等有模糊的想法。但由于从技术上讲该场景没有充满复杂的东西,因此没有灯光照明,带有alpha通道的草地等。 -游戏经过了非常优化,并且在较弱的硬件上也能很好地运行,为2012年提供了令人愉悦的画面。



7年后,您将以不同的眼光看待您的任何作品。技术进步了很多,工具已经改变,Unity引擎的最新版本与以前的版本有很大的不同。结合以上所有内容,将项目从版本4迁移到版本2017(出于多种原因,我决定停下来)是一项相当漫长而艰辛的工作。另外,由于不能将原始项目称为完整游戏(游戏中的大多数动作是使用带有触发功能的脚本执行的),因此有必要从头开始编写所有逻辑,与对象交互,清单,菜单系统,系统保存,成就,设置等。总的来说,我正在等待大量的工作!



开始。着色器和灯光



在新引擎中打开项目时,令人沮丧的第一件事是整个视线都损坏了。从第三方来源导入的许多着色器和后期效果均停止工作。那些继续工作的着色器看起来略有不同。场景中的光照发生变化,光照贴图飞散,所有内容都需要重新计算。







新的Standart



决定首先以新的PBR Standart替换旧的着色器。在上一篇文章中关于35MM开发主题,我已经提到了一种新型的PBR着色器(基于物理的渲染),这意味着正确的物理渲染。新材料Standard不再具有以前版本中常见的o.Gloss和o.Specular,这里有金属性贴图(o.Metallic)和平滑度。此外,还有更多的插槽用于放置各种类别的纹理。例如,我们有机会为软阴影添加遮挡贴图。此效果非常有用,因为它使您可以在光线较少的模型区域强调音量和阴影。没有此贴图和光照贴图-纹理,对象看起来很平坦且不现实。







有相同的“细节反照率”和“细节法线”-这些贴图为我们现有的纹理添加了细节,例如,您可以放置​​一个带有小裂缝的附加法线贴图,并通过调整影响程度对其进行着色。结果,原始的低分辨率凹凸纹理将显得更加详细。对于某些材料,我使用了此技术,而另一些则保持不变。







植被



更换基本材料后,我开始研究植被。游戏的原始版本使用没有投机者和法线贴图的标准Alpha测试着色器。当然,2019年的这种状况并不适合我。您可以在Internet上购买或找到现成的解决方案,其中包含带有着色器的完整包装和具有许多功能的现成模型,其中包括模仿随风摇曳等。但是传统上,我会尝试自己找出并尝试解决此类问题。这是一种体育运动。我的新菜色着色器基于Unity教程中Toon Ramp参考



提出的LightingRamp照明模型允许在多边形的被照亮的一面和相反的两边绘制阴影的轮廓。这模仿了树叶透射光的能力-半透明。







类似的着色器也可以用于渲染透明的织物,例如窗帘。







不幸的是,在这种模式下,使用Cull Off方法自动渲染多边形的背面并不能给出非常正确的结果,因此必须在编辑器中手动添加Backface。接下来,将法线贴图和镜面贴图添加到着色器。我无法使用PBR着色器照明模型并连接“反射探针”,但是在蒙版和“发射”贴图的帮助下,我添加了“环境光遮挡”模仿。最后,极其重要的是要恢复整件事并进行植被运动。使用顶点功能和相同的蒙版,可以使叶子板的所需区域栩栩如生。顶点偏移基于Unity手册中的示例“具有顶点修改器的法向拉伸”







您可以设置速度和幅度。顺便说一下,在这些实验中,用于管理着色器全局变量的新功能派上了用场...您可以从脚本轻松地将任何变量或纹理分配给所有必要的着色器。







闪耀



场景中非常照明设备的方法已发生重大变化。在原始图像中,所有光都被烘焙为光照贴图,并且渲染以“正向”模式工作。在翻拍过程中,重要的方面是使用实时光来改变一天中的时间。渲染模式已更改为“延迟”。主光源(太阳)用于混合模式,实时绘制定向照明和阴影,并将全局照明烘焙为纹理。这样就可以改变光的水平和方向,但是同时又保留了柔和的全局照明和反射的效果,这些效果始终使图片具有更高的真实感。并非针对所有对象都烘焙了光照贴图纹理,主要是针对大小不同的对象。小而复杂的扫掠可以保持动态,并且可以用光探头突出显示,反射测试或仅基本环境光(在主要照明设置中指定)。使用渐进式光照贴图器进行烘焙。















白天和黑夜



为了更改一天中的时间,创建了具有两种纹理的Skybox着色器:白天和黑夜。两种选择都补充了偏移功能,以模拟云的运动。还添加了战斗导弹飞行场景的夜空纹理和异常辉光。所有这些耻辱都是由一个特殊的脚本控制的,该脚本旋转了天窗和太阳,在太阳的某些位置,天窗的颜色发生了变化,使用Lerp方法混合了纹理,并顺利显示了夜空和星星。导弹发射后天空的辉光效果也添加到了单独的图层中。







为了在最小光照水平(约0.1-0.2)下进行优化,可以平滑地关闭阴影。要更改时间,必须考虑几个更重要的方面。在舞台上有颗粒-杨树绒毛。它们的材质对光没有反应(当时我还没有找到合适的着色器),因此绒毛材质的颜色必须根据一天的时间使用脚本进行更改。



同样,在更改时间时,脚本会为“全局雾”后效果调整所需的颜色,因为在白天,雾应看起来像是浅灰蓝色的薄雾,而在晚上,雾应具有更暗的,几乎是黑色的色调。







型号和新内容



主体位置和基本模型:主体建筑,树木,长凳,路灯柱的模型保持原始状态。许多其他道具已全部或部分重做。重新设计了煤油灯的模型,创建了具有单独可动画元素的新柴油发电机,电影放映机的新模型等。















以前无法输入的附近建筑物已经过重新设计,可供玩家使用。主楼的室内布局也发生了变化。除了重新制作旧内容外,还添加了新内容,例如PAZ巴士模型,游戏机,苏打水自动售货机,拼图-配电盘,地下室的密封门,库存物品等。一些内容是独立创建的,一些模型是外包的。







对于烘烤了光照贴图的几乎所有对象,都手动创建了UV2扫描,其中片段的最佳位置非常经济。例如,对于建筑物,玩家几乎看不见的所有难以触及的区域(例如,天花板和高层的墙壁)在扫描时占用的空间很小。



效果和自定义着色器。











在每个新项目中,我都希望考虑到我们之前闭上眼睛的细微差别。整体图片是由单独的细节创建的,即使不是很重要的元素也会影响感知。另外,这是一个挑战-每次都要改进我已经使用的方法。自己找到解决方案而不是使用现成的资产尤其令人满足。在以前的所有项目中,我都与水合作。通常,这是一个相当简单的顶点着色器,不会对播放器和场景中的灯光产生反应。它基于Unity Wiki的Mirror Reflection,它是镜像实现的示例。







由于顶点的位移(波的模仿),表面是动态的,但总是过于单调且有些无聊。通过对Light项目的反复试验,我设法创建了一个类似着色器的Surface版本,与示例一样,该着色器可以:从Mirror脚本接收镜面反射纹理,变形顶点以模拟波,将屏幕写入Grabpass纹理以在水下创建折射,具有柔软的Alpha边缘与几何图形相交时(深度淡入)。此外,为了对玩家产生反应,将有关玩家位置坐标的信息传输到着色器。在坐标点处绘制了一个动态点,当角色直接在水柱中时,它会模拟飞溅。表面着色器允许的最重要的事情是从任何光源接收照明。因此,水似乎更明显,体积物质,并允许您使用灯光效果来玩。







焦散



另一个重要的细节是焦散效果创造-光反射落在表面上。在注水的地下隧道的黑暗中,这项技术至关重要。使用投影仪对象和具有动画纹理的发光材质创建效果。着色器混合了2个苛性纹理,它们在不同的方向上发生位移,从而产生动态效果。在我的大多数着色器中,为了省钱,我通常使用包含4个通道(RGBA)的纹理蒙版-每个都用于特定目的。 R通道可以具有基本纹理,G通道可以具有较柔和的光斑,而B通道可以具有噪声纹理以使苛性图形失真。







水面有一个带有特殊标签的对撞机。角色一入水,脚本便使用射线投射方法检测到此情况,并平稳打开苛性碱。在这种情况下,还说明了几种情况,例如手中附近有打火机,手电筒或煤油灯。







粒子



对于空气中可见的小粒子,已经实现了一种有趣的效果。这个想法本身是由Homesick项目启发的,在该项目中,我曾经看到过类似的事情。在一定距离处,粒子具有规则的纹理,类似于杨树绒毛的纹理。但是随着摄像机的接近,着色器中的纹理会平滑地更改为第二个版本,让人联想到散焦效果。在动力学中,它看起来非常漂亮,并且粒子看起来更明显。







如上所述,场景中几乎所有基础表面都使用Standart PBR着色器的修改版本。有些人添加了具有不同斑点选项的蒙版,以获取有关反照率纹理的更多细节。添加了一个点罩,以模拟沥青或铺路石等表面上的雨水坑。主楼中的地砖着色器具有用于反射的附加贴图,该贴图由Mirror脚本渲染,类似于水面。为了进行优化,反射的渲染中仅包括基本对象和大型对象,并且在特定距离处关闭了反射的渲染。



雾/烟



创建重拍时我要考虑的一个重要细节是动态雾和灯光效果,尤其是灯笼的灯光。在早期的作品中,烟雾和雾的主要着色器是标准的“粒子混合”及其修改。这是一个顶点着色器,在性能方面不错,但完全不对光线产生反应。用这种材料制成的雾在阴影和光线下始终是相同的,不能用灯笼照亮,而且看起来也不总是那么吸引人和自然。在我所设想的地下地下墓穴中,阴霾应该被黑暗中的灯笼所突出,并由动态照明来强调。为了解决此问题,使用了免费Asset中的着色器。着色器不能夸耀高性能,但在视觉上可以完美地完成其任务。







贴花



另一个重要的一点是找到适合贴花的着色器。游戏计划了许多各种各样的涂鸦,这些涂鸦通常是使用旧的贴花系统插件安装的(自Unity 4.6的旧版本开始)。对于涂鸦,题词和标志,创建了一个4096 x 4096的大型图集,贴花上的图像是半透明的,并以“透明” alpha模式渲染,因此,在动态照明的情况下,由于标准的alpha着色器无法接收阴影,因此它们并不总是很合适。



为了解决该问题,创建了一个特殊的两遍着色器。第一遍绘制图像的深色部分,第二遍使用Blend DstColor One混合方法绘制浅色部分。我可能不太正确地理解了绘制方法,因此我将省略详细的解释,但我设法达到了预期的效果:在阴影中,图像被掩埋在黑暗中,在光中,图像看起来甚至是在玩彩色。两遍着色器对性能没有影响,因为Decal系统最初将所有贴花组合为一个大网格。也许有更好的方法,但是此选项非常适合我。











地球/草



为地面创建了另一个两遍着色器。该位置的实际区域由3d max中的几何图形制成。但是为了渲染草,创建了一个附加地形。我必须在正确的位置手动调整地形高度以匹配地形。然后关闭地形本身的渲染,并使用画笔将准备好的草网的几种变体应用到表面。就性能而言,地形上的本地草非常繁重,因为它不会批处理,并且每个元素都会创建一个附加的绘制调用(如果我错了,也许有人会纠正我),但是这种方法在工作方面非常方便。草的密度不高,在没有草的地方,表面的简单性非常显着。与此相关,作为实验,我使用了两遍着色器,上面提到的。第一遍是规则的不透明几何图形,第二遍是在Alpha测试模式下表面略微凸起的副本。粗略地讲,地面/草表面的副本会另外绘制,并具有坚硬的透明度,并且顶点会向上移动。这种方法在一定程度上补充了扁平草,并产生了更多细节和体积的错觉。







窗户外的光线将



一面半透明的精灵放置在主楼窗户外的某些地方,以模拟高光。此外,“全局雾”后效果具有明亮的白色雾参数,当英雄深入建筑物时会激活该参数。即,当角色在箱子的黑暗走廊中时,外部环境平稳地获得发白的辉光。这样可以创造出非常漂亮的艺术效果,并可以让您强调远景和远景。







到此结束本文的第一部分。链接到第二部分。谢谢大家的关注!



All Articles