做为一个横版无缝加载的游戏, 线性关卡无疑会做得非常长.
像UE4的ExponentialHeightFog就是一个全局生效的Actor, 我们无法针对每个区域放置不同参数的ExponentialHeightFog, 这对于关卡美术来说是一个不可接受的事实. 所以我们参考PostProcessVolume, 实现了ExponentialHeightFogVolume和AtmosphericFogVolume, 可以在不同区域之间进行无缝插值过渡:
知乎视频www.zhihu.com对于距离雾, 也同样实现了分段颜色的距离雾, 比较容易调节远景氛围:
PostProcessMaterial的Fog有个坑, 就是如果全局PPV没有这个Material的话, 插值时候的的默认值是材质的默认值, 当时美术一直奇怪为什么插值过程中会出现红色的雾...
当然中间也参考和评估过商城里的一个基于ColorCurve的后期距离雾实现
https://www.unrealengine.com/marketplace/en-US/slug/fog-gradientswww.unrealengine.com虽然这个做法可以实现更加丰富的颜色过渡, 但是调节起来并不方便, 所以最终美术还是选了自己做的那个几个参数的简单实现.
除了全局雾效, 还有一些区域性的氛围雾, 典型的是这种一束光打下来的效果:
使用体积雾很容易实现, 但是yaoyao想要那中雾里看起来是动态的效果, 类似Fornite这种:
于是参考Ryan Brucks大神的文章
https://shaderbits.com/blog/ue4-volumetric-fog-techniquesshaderbits.com实现出来了类似的体积雾材质:
知乎视频www.zhihu.com体积雾配合光照能够大大提升场景氛围的品质, 我觉得是场景间接光之外最重要的一个特性了, 我们甚至可以拿它来做云:
知乎视频www.zhihu.com后来在做优化时发现特效美术为了模拟烟雾缭绕的效果, 在场景中平铺了大片的粒子:
然后Overdraw就变成了这样:
于是想到了使用体积雾材质来进行优化:
反正体积雾是一直开着的, 不用白不用, 使用一些VolumeMaterial进行局部的点缀性价比很高, 还没有OverDraw的困扰:
知乎视频www.zhihu.com另外还尝试过一些流体雾的模拟, 只是性能和效果没有调出令人满意的结果, 所以很遗憾没有用进游戏里. 不过这里也发两个心目中做得比较好的效果来做结尾吧, 后面有机会还会继续尝试的.
一个是Fortnite中用于Trailer的流体雾模拟:
尝试过RayMarching的实现, 对于游戏来说还是开销太高.
另一个觉得不错的是NvFlex在UE4中的应用, 可交互雾具备足够的视觉冲击力, 最近在《黑神话:悟空》中看到的云的模拟应该是类似的做法:
https://www.youtube.com/watch?v=0ZkcZjyXq0wwww.youtube.com最后来个题外话: 为什么游戏的雾那么浓? 还是不是因为穷, 美术资源细节有限, 需要靠雾来遮遮丑...