天源安卓网

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

来源:天源安卓网

  荒野大镖客2所有天气设置,《荒野大镖客2》是一款非常受欢迎的开放世界游戏,玩家可以在游戏的世界里自由探索、打斗、完成任务、收集资源等等。而游戏中的天气设置也是一个非常重要的环节,从晴朗和多云到雨天和雪天,不同的天气现象会带来不同的视觉和游戏体验。在这篇文章中我们将重点探讨《荒野大镖客2》中的天气现象效果,包括它们如何影响游戏进度和游戏体验,玩家在不同天气下可以如何运用已有资源和策略,以及游戏开发团队在天气设计上的理念与创新。

荒野大镖客 救赎2中的天气现象效果如何

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何大镖客2的画面是我在次世代主机上见过最棒的了荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

首先上来先讲了游戏的整体风格目标与参考,大镖客2是初代故事的前传,发生在18世纪中期,那时候的美国西部城镇仍然很少,因此自然景色成了游戏的主体,团队也为此找了很多当时的风景画作为参考。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何地形参考荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何体积云

首先大致解释了什么是基于物理的Volumetric散射模型,当光照射到volume的粒子时,会有一部分被吸收或反射。朝相机位置散射的光子在光路上属于in-scattering,而那些其他方向的则属于out-scattering,同样也会影响到其他物体表面或者粒子的光照。这两部分的算法都和下图算式中的P(Phase function)相关。

这就是常说的multi scattering,通常为了简化模型只会去考虑参与透射这部分(transmittance)的out-scattering部分。

对于每个粒子可以把它的散射光计算分为Visibility和Phase function,具体Phase function是什么后文会提到,这里先知道就是个概率密度函数就好。

透射部分的计算用了Beer's law的指数衰减函数,描述了光线穿过volume medium的强度,受volume本身的extinction系数影响。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何Integration便是最终的光照计算式,可以看见包含了emission,scattering和transmittance

这里贴张15年EA他们在Siggraph的分享,可以看出就是同一套光照模型。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

设计理念尽量接近现实中的物理效果,实现出一套支持各种天气效果的系统。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

整个系统的结构,分为三大块展开来讲。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何Data model荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Cloud Map的RG通道分别存了两个云层,通过mask和噪声图生成。同时受到游戏中天气和时间参数的影响

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Cloud Height Map,RGBA8存altitude-based shape信息来云雾高度上的变换,大镖客支持层云(stratus)和积云(Cumulus),同时采样也受到天气参数的影响。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Cloud Detail参考了地平线在15年分享的做法,分别在xy和xz方向采样两次2D的displacement vector map,然后根据环境中的风力去得到3D noise LUT中的图。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

贴出了代码,可以很清楚的看到他们云的做法,这里可以看到还用了Cloud Height Lut的z通道来控制噪声变化的强度。

float2 c = SampleCloudMap(ray.p);
float3 cloudLut = SampleCloudLut(altitude);
float density = smoothstep(g_CloudShape.xz + cloudLut.xy, g_CloudShape.yw + cloudLut.xy, c.xy)
float rescale(vMin, vMax, v)
{
    return saturate((v-vMin)/(vMax-vMin));
}
density = rescale(noise, CloudLut.z, density);
荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

根据Cloud Map还可以实现这种雨汽的效果

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Localized Fog通过Fog Map实现,和Cloud Map一样覆盖了游戏中的所有可游玩区域。

Fog Map三个通道分别存了fog 起始高度、衰减距离和密度,生成的时候同样也受天气和时间的影响。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

全局的高度雾和localized fog结合后的效果,画面上体积感很好。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

另外一种localized fog的实现是让美术在场景里去摆Fog Volumes,基本原理就是particles配合alpha blending或者additive。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何Rendering荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

和guerrilla他们一样用的nut shell结构,近处用froxel,远处用ray marching。具体模型可以看他们家在Eurographics 2018做的分享。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Shading Model:对之前的公式做了解释,P代表phase function,L代表luminance,V代表visibility。注意这里说了用两束light octave来估计multi-scattering,下文的公式有详细说明。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Phase Function:描述了给定波长的光在莫个角度下因为粒子发生散射的现象,即光子的概率密度函数。

大镖客2里面用了Henyey-Greenstein phase function(即下图的HG),g是anisotropy值,存在material volume中。但是传统的HG只在霾这种强scattering的volume上效果比较好,并不能很好的表现multi-scattering和back-scattering,于是需要做改进。

可以看到这里计算phase function时用了多个HG function来累加,去计算multi-scattering的效果,并用weights让美术去改变效果,最终为了性能只用了两个octave来累加。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

然而效果仍然缺了back-scattering的部分,于是这里对最终结果做了一个fake效果。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何back-scattering也受到extinction系数影响

最终效果非常棒,也能随着天气和时间产生丰富的变化。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Visibility:这里主要通过shadow map来得到物体的可见性,对于云,会额外朝主光源(太阳或者月亮)去采样extinction来得到更高频率的shadow,采样的距离也受到天气和时间参数的影响。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Terrain Shadow Map通过对terrain的高度图做raymarch获得,得到的图为RG16F,分别存光线求交时检测得到的地形高度和Ray Length。之后将R通道的Intersection height和terrian shadow map做比较得到最终的可见性结果。Ray length可以用于比较中调整threshold来改进软阴影效果。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

对于Ambient Light,这里的Visibility重用了上面cloud raymarch的结果。远处raymarch渲染的会去采样一个低分辨率的抛物面贴图,并做了Parallel reduction。对于近处frustum的物体直接使用烘焙好的Irradiance probe filed,里面存了计算所需要的光照信息。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Local Lights的做法比较节省性能,直接通过采样light cluster volume来得到,visibility也是用shadow map去做。为了性能考虑,只了一个HG函数来计算做single-scattering模型。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Rainbows的具体做法没怎么提,可以直接通过调整volume中的雨水密度来产生(下文的material volume会说)。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Lightning(闪电,刚看到时理解成光照了QAQ)的做法比较简单粗暴,每个闪电会生成一个点光源到一个list,然后去迭代计算每个点光源。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

场景中的scattered light source大概就是这些。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

上面讲的都是如何在物体表面的一个采样点去计算散射光,接下来会介绍如何去做场景中渲染物件的管理。

上面有提到,近处物体都会去采用froxel的方式去管理,一般情况下视锥空间形成的体素大小为160x88x64,但在一些室内场景会适当缩小。最终生成了三个clip-space volume。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何再贴张EA之前的分享作为参考和对比

Shadow Volume采用R16F格式,存储了所有直接光照的阴影信息,包括CSM、Cloud shadow map和Terrain shadow map。这里还用了temporal filtering来解决高频阴影细节的undersampling。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Material Volume比较大,又分成了两个Sub Volume:

第一个volume存了scattering和absorption的系数,第二个volume的R存了phase function中用到的anisotropy值,G存了全局的emission值(这里有提到渲染管线中不支持emissive fog per volume),B通道存了ambient intensity,主要用于室内的ao效果,最后的A通道就是之前说的雨水密度,用来调整彩虹效果的强弱。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

在Material accumulation这个pass,所有的材质都会被采样然后做混合。顺序是先做alpha additive再做alpha blend,这样更方便去做一些城镇建筑物的细节。而为了在室内支持不同的粒子效果(如炉火、吸烟、爆炸等),把particles放到最后去计算。

这里还提到所有的材质source都使用噪声来做tilling,并受风力影响。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

和shadow volume一样,这里同样对第一个sub volume使用了temporal filtering。

这里还提到在使用风力作为motion vector绘制室内场景时会有leaking的问题,于是制作组存了一个velocity magnitude volume去解决。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

最后介绍的是Scattered Light Volume,通过采样material和shadow volume生成,存储了所有直接光(日光和Local Light)和环境光(通过采样之前提到的irradiance probe gird)的散射光强度。用于在accumulation pass中去计算in-scatter和transmittance。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

这里没有使用Temporal,取而代之的是用dithered lookup和TAA的方法。主要原因是光源移动时会产生光源的残影,同时对于一些密度较大的volume当相机移动时也会产生拖尾。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

上面介绍了游戏中的整个froxel,然而由于volumes的大小有限,对于一些高频细节难以实现,使用起来精度也不够,于是制作组选择了同时采用Raymarching的方式。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

Ray length通过depth buffer和ground plane以及cloud dome求交结果计算得到。为了减少计算开销,用了地平线在15年分享的做法,每次和cloud相交时,都会二分步长,然后从中点出发继续迭代,通过不断的重复直到达到预先设定好的i_max次数,然后按照这个step size继续迭代下去。下图也可以很清楚的看到raymarching的步长。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

从froxel结束的位置开始做发出光线,根据blue noise做偏移。Target resolution只有屏幕分辨率的一半,然而即使这样开销还是很大,于是将reconstrction分散到了4祯去做。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

下图一系列都是做reconstruction的方法,这块比较复杂先搁置以后补上,建议去看原文。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

最终需要将半分辨率的frame拉伸到全分辨率,使用的做法和Scattered Light Volume时一样,用了dithered和TAA,可以看到效果很不错。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

最后的渲染开销统计,raymarching果然是开销最大的部分。因为所有的实现都是computer based的,所以很多都可以overlap执行,在主机平台上也能很好的结合async computer节省带宽压力。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何Scene Integration荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

天空的散射预计算参考了EA在16年的分享,在此基础上加入了earth shadow来提升随dynamic time of day的效果。根据时间段更新LUT,并缓存到一个volume里去参与计算后续的forward和deferred lighting。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

为了性能考虑并没有在每个采样点去做,只在raymarching之后在weighted depth上采。为了突出体积光效果,将visibility计算分离出来在shadowed area里算,结果随着透射会衰减。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

在渲染完所有不透明物体后开始渲染半透明物体,将之前得到的scattering light volume、raymarch与天空的scattering/transmittance拿来参与计算。这里还会用到Cirrus cloud layer作为密度的lookup,除此之外和之前云的shading model一致。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

结合起来的渲染效果,无论是近处还是远处细节都无可挑剔。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

天空的环境光,晴朗时候蓝色的天空就是用这个实现的。用了一个32x32大小的probe去采,每256平方米摆一个。得到的光照采样结果用于在该方向上的瑞利/米式散射计算中。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

为Sky Irradiance probes部分做的优化,visible probe采样光线更多,但是也不能忽略invisible probe。采样时用了大步长,而且没做refinement。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

reflection cube使用了一个低分辨率的的cube map去存in-scattering和transmittance。为了降低开销,raymarching采样部分同样和sky irradiance probe做法一样。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

水的反射混合了SSR、reflection probe、planar reflections和height map tracing,因为使用的分辨率不高,最终开销也很低,同样raymarch时也用了temporal blend来做trick。

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

未来的一些改进方向,比较期待volumetric shadows和wavelength dependent transmittance....

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何

感谢R星的graphics and lighting team以及娜姐(这几年SIGGRPAH都是她主持了

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何References

这里我直接找出了各个ref的链接,方便查找

Real-Time Atmospheric Effects in Games

Exponential Shadow Maps

The Real-time Volumetric Cloudscapes of Horizon: Zero Dawn (地平线的云)

Volumetric Fog: Unified Compute Shader-based Solution to Atmospheric Scattering

Physically-based & Unified Volumetric Rendering in Frostbite - Frostbite

Oz: The Great and Volumetric

Precomputed Atmospheric Scattering

Applied Graphics Research for Video Games(娜姐当年在I3D上的经典talk)

Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite(这篇同样内容很足,推荐)

Volumetric Lighting for Many Lights in Lords of the Fallen

Real-time Volumetric Lighting in Participating Media

Low Complexity, High Fidelity - INSIDE Rendering (感觉Playdead他们组的技术力很强...虽然做的游戏看上去规模不大)

Improved Culling for Tiled and Clustered Rendering (COD组的talk,和剔除相关)

荒野大镖客2所有天气设置 荒野大镖客 救赎2中的天气现象效果如何个人感想

去年我自己在玩大表哥2时,就惊叹于其自然环境渲染的逼真,做任务赶路时也经常会停下来看看风景。今年Siggrpah得知他们来分享后,第一时间就下了Slide分析他们的做法,看着看着就做了不少笔记,于是想着干脆发出来分享一下,也可能对其他人有些参考意义。不过由于我水平有限,感觉一些细节的地方理解很不准确,也欢迎各位看了原分享后有什么不同的看法指出来让我改正。

  总的来说,在荒野大镖客2中,天气现象对游戏体验产生了显著的影响。雨、雪、雾等不同的天气条件都会给玩家带来不同的挑战和感受,增加了游戏的乐趣和深度。虽然有些玩家可能会觉得天气对游戏的进行产生了一定的影响,但这也恰恰体现了游戏制作团队对细节的打磨和用心,让玩家能够更好地融入到游戏世界中去。

相关文章

猜你喜欢