大世界-天气系统(开篇)

转载请注明出处 何文西

1. 环境

1) 场景使用光照图

可以烘培出白天和夜晚俩种光照图,在玩家切换场景时根据时间系统选择加载哪种光照图。如果要做实时变化的效果,可以同时加载俩种光照图,然后在shader里根据时间做融合。

2) 场景使用实时光照

这种方式最简单,调整环境光或光源的亮度和颜色。

3) 后处理方法

在后处理shader里直接在颜色上乘以一个Tint Color。

2. 风

风可以引起植被的摆动。 

1) 通过骨骼动画

这种通过动画的方式可以让摇摆更加生动,但是考虑到树木的数量,这种方式效率最低,基本上不采纳此方案。

2) 通过UV来做权重控制顶点动画

这种方案只适合面片草。草的根部和顶部的摆动权重就是一个0到1的线性变化,可以用一个正玄波实现。

//根据UV实现简单的顶点动画  
float4 newPos = v.vertex;   
newPos.xyz += _Wind_Simple.xyz * v.texcoord.y * _BendingFactor;  

3) 用顶点和模型原点的距离来做权重控制顶点动画

CE3的Main Bending就是这种方案。顶点到模型原点的距离,其实就是模型的顶点值,再用这个值除以包围盒的参数,就能得到每个顶点0到1的摆动权重。这种方案对UV就没要求,适合所有植被。但是这种方案不能用于合批,比如Unity自带的静态合批,因为合批以后模型其实已经变了。

4) 用顶点颜色来做权重控制顶点动画

CE3的Detail Bending就是此方案。让美术刷顶点颜色,来作为摆动权重。顶点颜色有几个通道,每个通道实现一种频率的摆动,这样就可以实现比较复杂的摆动,比如Blue通道用来处理主干的摆动,Red通道处理树枝的摆动,Green通道用来处理树叶的细节抖动。这种方案好处是,不受UV和合批的影响,适合任何植被,而且还可以实现比较复杂的细节抖动,让抖动更真实。麻烦的就是要教会美术刷顶点色,而且效率开销最大。

3. 雨

1) 粒子特效方法

粒子最大的缺点就是密度稀疏,消耗也很大,但效果最好。方法是制作一个跟随相机移动的产生雨滴的粒子特效,一个跟随角色脚底的不断随机产生涟漪的粒子特效。雨滴不要使用碰撞到地面或物体后产生涟漪的效果,考虑到手机环境物理碰撞会带来很大的消耗。

2) 后处理方法

效果一般,也会有效率问题。

3) uv动画的面片

挂一个uv流动的面片在镜头前,闪电的效果就是把这个面片调整为白色再调整回来。这种方法主要缺点是很难做出深度感,就是雨滴在空间中分布的感觉。

4) 锥形体面片

方法3的进化版,虽然解决了深度感问题,但是极大的增加了overdraw

4. 雷电

方法和雨类似,二者可以结合一起实现。

5. 雪

雪效果和雨滴类似。由于雪花生命周期比较长,飘落速度比较慢,粒子数最多在300左右就可以达到不错的效果。还可以加一些序列帧动画之类的小技巧来优化雪片的效果。

为了提高效率也可以用一张图来表现几片雪花的效果,缺点就是仔细观察的话会发现一些重复感,overdraw也会稍微有些提高。

总结

在效果方面,由于要兼顾移动平台的性能限制,相比端游的动态天气效果做了很多妥协和简化。比如下雨还可以添加地面湿滑的材质效果,还可以制作暴风雨这样更动感刺激的天气效果,在沙漠中实现沙尘暴的感觉等等。

插件

最后推荐一款专业的天气插件:NuajWeatherSystem

引用[1]:https://blog.csdn.net/qq18052887/article/details/50995928

引用[2]:https://blog.csdn.net/qq18052887/article/details/51007111

引用[3]:https://www.jianshu.com/p/2f8f88d7d86e

猜你喜欢

转载自www.cnblogs.com/TravelingLight/p/9008399.html