旷野之息 《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的

编辑:
发布时间: 2020-12-26 15:55:55
分享:
本文原载于B站专栏未来游戏研究所,已获译者授权。原作者:Redneckerz译者:未来游戏研究所来源:未来游戏研究所地址:https://www.bilibili.com/read/cv3239418【编译自resetera】我其实很久以前就想做一篇正式的《塞尔达传说:旷野之息》引擎分析文章了,但一直没时间去弄。然而,现在Switch有了新的视频录制功能后,我想这是一个完美的时机来重游这款游戏并通过我上传到Twitter上的视频来分享我的想法。我将先从我的研究结果摘要开始,但我也会在文章的后面对每一个技术特性进行细分以便通俗易懂。同时我也会尽可能避免出现重复内容。比如说像是Digital Foundry这样的已经分析了引擎的一部分特性,那我就不会再在这里提及到了。这篇帖子的目的是为了让更多的人接触到其他人不打算费心去调查的,游戏中的技术成就。总之,这里就是这款引擎特性的总结:

Global Illumination | 全局光照

Local Reflections | 局部反射

Physically-based Rendering | 基于物理的渲染

Emissive materials/area lights | 自发光材质/区域光源

Screen Space Ambient Occlusion | 屏幕空间环境光遮蔽

Dynamic Wind Simulation system | 动态风力模拟系统

Real-time cloud formation | 实时云体变形

Rayleigh scattering/Mie Scattering | 瑞利散射/米氏散射

Full Volumetric Lighting | 完整体积光照

Bokeh DOF and approx. of Circle of Confusion | Bokeh景深与模糊圈的近似值

Sky Occlusion and Dynamic Shadow Volumes | 天空遮蔽与动态阴影体

Aperture Based Lens Flares | 基于光圈的镜头光晕

Sub-surface Scattering | 次表面散射

Dynamically Localized Lightning Illumination | 动态局部闪电照明

Per-Pixel Sky Irradiance | 逐像素天空辐照度

Fog inscatter | 雾光散射

Particle Lights | 粒子光源

Puddle formation and evaporation | 水坑的形成与蒸发

Global Illumination/Radiosity | 全局光照/光能传递首先我想要声明一点,所有所谓的实时全局光照方案都是以某种方式伪造出来的,都具有着不同程度的准确性。任何仅仅因为没有使用路径追踪之类的而忽略了《塞尔达:旷野之息》中的全局光照方案的人们应该仔细想想自己究竟在说些什么。最重要的一点是,这一切都是实时渲染的;这不仅仅是烘培入纹理中的光照,这对于一款开放世界游戏来说非常令人钦佩。那么,光能传递到底是个什么东西?嘛,在3D图形渲染中,它是从不同表面反射的光,并在这个过程中讲颜色信息从一个表面传输到另一个表面的全局光照近似法。光能传递越是准确,为了传输适当的颜色就需要计算更多的反射光。在《旷野之息》中的引擎用的是光照探针在整个环境中收集在光照探针附近不同表面的颜色信息。并没有什么模拟反射光,只是一个给定区域中基本颜色的一些近似值。《旷野之息》用于计算此信息的算法尚不清楚,但我的最佳猜测是球谐函数或之类的东西,基于颜色平均值与光能传递局部化。与《超级马里奥:奥德赛》不同,《旷野之息》中的光能传递并非二进制而是粒子。从光照探针计算的照明信息似乎与LOD系统在同一个渲染管线层次捆绑串流,使得其效率极高。观察建议:注意当相机靠近该区域时,岩石悬崖是如何从草地上接收到绿色色调的。屏幕空间反射+镜面高光局部反射之谜解开了!基于物理的渲染效果演示图

Emissive materials and area lights | 自发光材质与区域光源

这一个比较简单。发光物件的材质提供独特的光源,以与材质本身相同的形状照明环境。这些并不是在所有方向上传播的点光源,甚至有时会是在一个方向上照明的简单定向光源。有一点很重要值得一提,只有全局光源才能投射阴影。然而,双向反射分布函数仍然应用于游戏中所有的光源。观察建议:注意火剑所投射的光的形状。这一形状与剑本身的形状相匹配,但光的强度将取决于剑与它所照明的表面之间的距离。自发光材质与区域光源效果图

Screen Space Ambient Occlusion | 屏幕空间环境光遮蔽

在现实世界中,当光在环境中反射后会有一定量的"环境光"为环境着色,使其变得完全漫射。如果说阴影是遮挡直射阳光物体的产物的话,那么环境光遮蔽可以被认为是环境中缝隙阻挡环境光的产物。《旷野之息》中所使用的方案称为SSAO,因为它计算了屏幕空间中的环境光遮蔽并且取决于视点依赖。环境只会在相对于相机垂直时它才会接收环境光遮蔽。观察建议:当从正面看时,在墙壁中的缝隙中寻找黑暗,阴影的噪声模式效果。同样的噪声模式也从这个角度勾勒出了林克的轮廓。屏幕空间环境光遮蔽效果演示图

Dynamic Wind Simulation system | 动态风力模拟系统

这一个让我感到很惊讶,因为我完全没想到它会如此的强劲。基本上来说,物理系统与风力模拟系统是相关联的。它是完全动态的,并根据各自的重量值影响不同的物体。受影响效果最突出的对象是草地与程序生成的云。观察建议:如果你仔细观察的话,可以在这里看到草和云的方向性流动是如何与风的变化方向相匹配的。观察建议:注意随着太阳落山,雪的颜色也随之发生变化。完整体积光照效果演示图

Bokeh DOF and approx. of Circle of Confusion | Bokeh景深与模糊圈的近似值

我认为引擎所用到的另一个令人惊讶的功能是延迟光照/着色。那么我要稍微简化一点,因为这可以真正地在技术上解释首先为什么现实世界中会出现散景效果。可以说当光进入肉眼/相机的光圈时,入射光线开始会聚到焦平面的单个点上。随着光越来越集中在这个平面上,它的外观变得越来越锐利,越来越小。随着光远离该平面并变得更加散焦,它的外观变得越来越大,越来越模糊。家喻户晓的散景效应是当进入相机镜头的光点呈现出在它们通过光圈时的形状。模糊圈是当人类无法区分完全聚焦的光点与略微失焦的光点时的聚焦区域。景深通常由模糊圈来决定。有趣的是,当使用希卡望远镜与相机符文时,《旷野之息》会模拟出这两种概念。我的猜测是它是基于纹素数据在屏幕空间中计算的,然后作为后期特效应用。观察建议:注意相机的十字线与金属盒上闪耀的蓝色灯光。当相机对焦于远离光源的远景时,光源就会变得模糊,同时变得更大。当相机直接对焦于光源时,则会出现相反的情况。蓝色光源所形成的圆形形状称为散景效果。

Per-Pixel Sky Irradiance | 逐像素天空辐照度

如果说辐射率是来自太阳的辐射量的话,那么辐照度就可以说是给定表面实际接收的辐射量。对于散射天光来说,这是一个相当重要的变量,因为我们之所以能够在夜晚看向太空的主要原因就是因为没有它!《旷野之息》使用一种跟踪太阳相对于天顶位置的算法来计算辐照度,并且在日落期间,它开始逐像素地移除天光,直至没有剩下的辐照度为止。当天空中没有了云层与米氏散射后,星星将开始出现在天空中,即便天还没有完全黑下来。夜晚与白天之间的颜色渐变过渡实在是令人印象深刻。观察建议:本身你是可以在太阳落山时星星出现的,但由于Twitter+动态二重压缩,这一点也就看不到了。

Fog inscatter | 雾光散射

在现实世界中,雾像物理对象那样接收光与影。如果雾是体积的话,那么计算机图形的计算效率就会很低。《旷野之息》通过创建一份雾噪声模式并应用来自太阳和天光的辐射值来生成光散射来解决这个问题。当你将其与阴影体结合使用时,不仅可以获得体积光照,即便在没有体积的情况下它看起来也会像是有体积的雾。观察建议:注意山上的雾是如何呈现出环境中可用光的颜色的,同时看起来还很有体积感。

Particle Lights | 粒子光源

游戏中几乎每一个粒子都是自发光的。其中许多同时也照明了环境。许多粒子不是将粒子视作物体而渲染,而是可以在3D空间的所有方向上发光的简单的点光源。观察建议:注意无论相机如何移动,发光的余烬是如何在3D空间内独立移动的。观察建议:雪粒子在《旷野之息》中是视为粒子光源渲染的。一种产生了雪粒子能够反射太阳光的错觉的方法。不过这也可能仅仅是不同的美术选择就是了。观察建议:注意萤火虫是如何照明它们周边环境的。水坑的生成观察建议:仔细观察雨停且太阳出来时水面是如何"蒸发”的。水坑的蒸发我其实还回去翻阅了一下这游戏的文本转储,几乎证实了我所提到的所有内容。看来我应该先去翻翻文本转储而不是在游玩过程中调查引擎,这样就轻松多了!总之,这里是Pastbin链接:https://pastebin.com/Jc9b0BCp于是,本次分析就已经结束了。与往常一样,如果你对帖子中所提供的信息有任何疑问的话,欢迎随时告诉我。
相关阅读
热门精选
孩子 皮肤